首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何简化基于属性组合两个数组的es6函数?

如何简化基于属性组合两个数组的es6函数?
EN

Stack Overflow用户
提问于 2016-10-08 02:11:31
回答 3查看 69关注 0票数 2

我有两个数组,一个现有的集合和一个新的数组。我想通过以下方式将两者结合起来:

  • 从existingConversations中的所有元素开始
  • 对于新数组中的每个项,如果现有数组中不存在具有相同id的元素,那么我们将添加它。
  • 如果一个项目确实存在于同一个id中,那么只有当新项目的updated属性值大于现有项的updated属性值时,我们才会替换现有的项。
  • 如果它不大于我们只是忽略了新的元素。

我们不能修改传入的数组,必须返回组合数组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function combineConversations(newConversations, existingConversations) {
  const combined = [...existingConversations];
  newConversations.forEach(conversation => {
    const existingConversationIndex = indexOfObject(combined, conversation.id , 'id');
    if (existingConversationIndex && conversation.updated > combined[existingConversationIndex].updated) {
      combined[existingConversationIndex] = conversation;
    } else {
      combined.push(conversation);
    }
  });
  return combined;
}

我想知道一种完整的功能方法。有一个吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-08 08:45:39

这样啊,原来是这么回事!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function combineConversations(myArr) {
  return myArr.filter((item1, pos, arr) =>
    arr.map(item2 => item1.id === item2.id && item1.updated === item2.updated).indexOf(true) === pos &&
    arr.every(item2 => !(item1 !== item2 && item1.id === item2.id && item1.updated < item2.updated))
  );
}
combineConversations([...newChat, ...oldChat]);

var oldChat = [
  {id: 1, updated: 1985, data: "coucou"},
  {id: 2, updated: 1995, data: "au revoir"},
  {id: 3, updated: 2003, data: "bonjour"},
  {id: 4, updated: 2016, data: "hallo"},
];

var newChat = [
  {id: 1, updated: 1986, data: "coucou"},
  {id: 2, updated: 2004, data: "bye"},
  {id: 3, updated: 2001, data: "bonjour"},
  {id: 5, updated: 2008, data: "vive le sport"}
];

var expected = [
  {id: 1, updated: 1986, data: "coucou"},
  {id: 2, updated: 2004, data: "bye"},
  {id: 3, updated: 2003, data: "bonjour"},
  {id: 4, updated: 2016, data: "hallo"},
  {id: 5, updated: 2008, data: "vive le sport"}
];

谢谢@kevin-ternet你的回答。你让我走上了正轨!

票数 0
EN

Stack Overflow用户

发布于 2016-10-08 04:07:35

是的,您可以使用这样的功能方法来完成它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var oldChat = [
  {id: 1, updated: 1985, data: "coucou"},
  {id: 2, updated: 1995, data: "au revoir"},
  {id: 3, updated: 2003, data: "bonjour"}
];

var newChat = [
  {id: 1, updated: 1986, data: "coucou"},
  {id: 2, updated: 2004, data: "bye"},
  {id: 3, updated: 2001, data: "bonjour"},
  {id: 4, updated: 2008, data: "vive le sport"}
];

var result = (oldChat, newChat) => newChat.concat(oldChat).sort((a,b) => a.id-b.id).filter((item, index, arr) => index < arr.length - 1 ? item.id !== arr[index+1].id : true);
console.log(result(oldChat, newChat)); //[ { id: 1, updated: 1986, data: 'coucou' },
//{ id: 2, updated: 2004, data: 'bye' },
//{ id: 3, updated: 2003, data: 'bonjour' },
//{ id: 4, updated: 2008, data: 'vive le sport' } ]

编辑:我合并了旧数组和新数组,并对它们进行排序,获得具有相同id的附件,然后进行筛选,以保留具有唯一id或最新更新的数组。

票数 1
EN

Stack Overflow用户

发布于 2016-10-08 08:55:32

下面是解决您问题的另一种方法(我使用了@kevinternet示例,希望他不介意):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var oldChat = [
  {id: 1, updated: 1985, data: "coucou"},
  {id: 2, updated: 1995, data: "au revoir"},
  {id: 3, updated: 2003, data: "bonjour"}
];

var newChat = [
  {id: 1, updated: 1986, data: "coucou"},
  {id: 2, updated: 2004, data: "bye"},
  {id: 3, updated: 2001, data: "bonjour"},
  {id: 4, updated: 2008, data: "vive le sport"}
];

var intersect = oldChat.reduce((memo, val) => memo.concat(newChat.find(v => val.id === v.id && val.updated < v.updated) || val), []);
var diff = newChat.filter(x => !oldChat.some(y => y.id === x.id));

console.log(intersect.concat(diff));

这样做的目的是:

  1. 两个数组相交。这是一个特殊的交集:如果比较元素具有相同的ID,我们必须采用更新更多的元素,以便find具有特殊条件,新元素必须比旧元素更新得更多,否则,我们还没有找到正确的替换。
  2. 我们必须处理oldChatnewChat之间不常见的元素。由于我们执行了从oldChatnewChat的特殊交集(这保证了oldChat中的所有对象都将在新的对象中),所以我们执行从newChatoldChat的区别。
  3. 为了得到期望的结果,将特殊的交点与差分连接在一起。

希望能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39931146

复制
相关文章
Redis快照错误引发的血案
用我那并不熟练的英语读了一遍,感觉好像是配置的rdb快照,但是现在却不能写入磁盘。所以报错了。
用户1072003
2022/12/02
7700
应用依赖不同的Netty版本引发的错误
Caused by: java.lang.NoSuchMethodError: ...
书唐瑞
2022/06/02
3.9K0
应用依赖不同的Netty版本引发的错误
Kubernetes因限制内存配置引发的错误
今天对一个pod进行内存资源调整后, 一直卡在ContainerCreating的状态, 执行describe命令查看该 Pod 详细信息后发现如下 。
程序员同行者
2019/04/09
18.5K0
python的标准输入,输出,错误输出。
    python中的sys模块有标准输入,标准输出,以及标准错误输出的方法。
py3study
2020/01/13
3.6K0
JavaScript 判断输入的值为数字
使用js自带全局函数isNaN(), isNaN()返回一个Boolean值,如下 :
Devops海洋的渔夫
2019/06/02
3.5K0
XGBoost缺失值引发的问题及其深度分析
XGBoost模型作为机器学习中的一大“杀器”,被广泛应用于数据科学竞赛和工业领域,XGBoost官方也提供了可运行于各种平台和环境的对应代码,如适用于Spark分布式训练的XGBoost on Spark。然而,在XGBoost on Spark的官方实现中,却存在一个因XGBoost缺失值和Spark稀疏表示机制而带来的不稳定问题。
美团技术团队
2019/08/20
1.4K0
XGBoost缺失值引发的问题及其深度分析
XGBoost缺失值引发的问题及其深度分析
XGBoost模型作为机器学习中的一大“杀器”,被广泛应用于数据科学竞赛和工业领域,XGBoost官方也提供了可运行于各种平台和环境的对应代码,如适用于Spark分布式训练的XGBoost on Spark。然而,在XGBoost on Spark的官方实现中,却存在一个因XGBoost缺失值和Spark稀疏表示机制而带来的不稳定问题。
石晓文
2019/08/28
1.4K0
XGBoost缺失值引发的问题及其深度分析
foreach 引发的值类型与引用类型思考
用都知道的一句话概括:“引用类型在堆上,栈上只保存引用;值类型即可存放于栈上也可存放于堆上,值类型变量直接存储值本身”。
雪飞鸿
2018/09/05
7420
foreach 引发的值类型与引用类型思考
XGBoost缺失值引发的问题及其深度分析
XGBoost模型作为机器学习中的一大“杀器”,被广泛应用于数据科学竞赛和工业领域,XGBoost官方也提供了可运行于各种平台和环境的对应代码,如适用于Spark分布式训练的XGBoost on Spark。然而,在XGBoost on Spark的官方实现中,却存在一个因XGBoost缺失值和Spark稀疏表示机制而带来的不稳定问题。
Python数据科学
2019/08/30
8940
XGBoost缺失值引发的问题及其深度分析
XGBoost缺失值引发的问题及其深度分析
XGBoost模型作为机器学习中的一大“杀器”,被广泛应用于数据科学竞赛和工业领域,XGBoost官方也提供了可运行于各种平台和环境的对应代码,如适用于Spark分布式训练的XGBoost on Spark。然而,在XGBoost on Spark的官方实现中,却存在一个因XGBoost缺失值和Spark稀疏表示机制而带来的不稳定问题。
数据猿
2019/08/20
8550
XGBoost缺失值引发的问题及其深度分析
Spring Data默认值的错误
Spring Data有很多配置的默认值,但不一定都适合你。如一个依赖Cassandra 的项目,有时写入数据后,并不能立马读到。这种错误并没有什么报错,一切都是正常的,就是读不到数据。
JavaEdge
2023/01/15
1.1K0
两个案例解析复制错误引发的故障
MySQL Replication是MySQL非常重要的特性。用好了,可以发挥很大的作用,做负载均衡,做读写分离,做备份等等,能在关键时刻救DBA一命;用不好,那就是给DBA自己找麻烦了,处理不尽的故障。所以我这边给大家分享两个关于复制的案例。
wubx
2019/02/27
6530
两个案例解析复制错误引发的故障
MySQL Replication是MySQL非常重要的特性。用好了,可以发挥很大的作用,做负载均衡,做读写分离,做备份等等,能在关键时刻救DBA一命;用不好,那就是给DBA自己找麻烦了,处理不尽的故障。所以我这边给大家分享两个关于复制的案例。
wubx
2019/04/24
7610
Pandas基础:查找与输入最接近的值
有时候,我们试图使用一个值筛选数据框架,但是这个值不存在,这样我们会接收到一个空的数据框架,这不是我们想要的。我们想要的是,在数据框架中找到与这个输入值最接近的值。
fanjy
2022/06/04
3.9K0
Pandas基础:查找与输入最接近的值
PHP 容器化引发线上 502 错误状态码的修复
笔者所在公司技术栈为 Golang + PHP,目前部分项目已经逐步转 Go 语言重构,部分 PHP 业务短时间无法用 Go 重写。
仁扬
2023/08/01
3100
一个SingleTask与跳转传值引发的血案
后来想到,Activity A使用了SingleTask的launchMode,猜想可能跟这个有关,在执行界面跳转的时候,不会生成新的Activity A实例,所以可能不会接收到传过来的Bundle里面的值。于是将Activity A的launchMode改为了Standard,果然,B传过来的值,A可以接收到(见图:1-3),验证了我的猜想。
代码咖啡
2018/08/28
1.1K0
一个SingleTask与跳转传值引发的血案
故障分析 | 一个索引创建错误引发的思考
作者:刘晨,网名 bisal ,具有十年以上的应用运维工作经验,目前主要从事数据库应用研发能力提升和技术管理相关的工作,Oracle ACE(Alumni),腾讯云TVP,拥有 Oracle OCM & OCP 、EXIN DevOps Master 、SCJP 等国际认证,国内首批 Oracle YEP 成员,OCMU 成员,《DevOps 最佳实践》中文译者之一,CSDN & ITPub 专家博主,公众号”bisal的个人杂货铺”,长期坚持分享技术文章,多次在线上和线下分享技术主题。
爱可生开源社区
2023/09/20
2210
故障分析 | 一个索引创建错误引发的思考
input number 数字输入限制,最大值最小值输入范围限制
方式一:max="100" min="10" 这种方式限制的是数字输入框右边的增减箭头按钮,最大值和最小值,不能对手动输入的数进行限制。如果手动输入一个大于100或小于10的数,还是无法限制。 <input type="number" max="100" min="10" value=""> 方式二:oninput // 只限制长度:输入四位数的数字 <input type="number" oninput="if(value.length>4)value=value.slice(0,4)" />
acoolgiser
2022/03/07
16.8K0
点击加载更多

相似问题

Ada,抛出的值:“CONSTRAINT_ERROR:”的输入错误。

215

Ada CONSTRAINT_ERROR在“应该”时未被引发

14

Ada记录初始化:"Constraint_Error“

20

为什么Ada不引发约束错误?

11

使用8不可除的模块类型时引发Constraint_Error

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文