javascript - 组合对象数组的特定属性

标签 javascript arrays ecmascript-6 javascript-objects

如果组合时在第二个数组中不可用,则为基础“默认”添加默认值

var arrayOne = [{id: 1, name: 'A'},{id:2, name: 'B'},{id:3, name: 'C'},{id:4, name: 'D'},{id:5, name: 'E'}];
var arrayTwo = [{id: 1, basis: 'Online'},{id:3, basis: 'Paper'},{id:4, basis: 'Referrer'}];
一个结果应该是:
var combinedArray = [{id: 1, name: 'A', basis: 'Online'},{id:2, name: 'B', basis: 'Default'},{id:3, name: 'C', basis: 'Paper'},{id:4, name: 'D', basis: 'Referrer'},{id:5, name: 'E', basis: 'Default'}];
我们可以得到从第一个数组中删除名称的数组的其他结果,如下所示
var combinedArray2 = [{id: 1, basis: 'Online'},{id:2, basis: 'Default'},{id:3, basis: 'Paper'},{id:4, basis: 'Referrer'},{id:5, basis: 'Default'}];
我试过
var combinedArray = []; 
arrayOne.forEach(objOne => {
  arrayTwo.forEach(objTwo => {
    if(objOne.id === ObjTwo.id){
      combinedArray.push({...objOne,...objTwo});
    }
  });
});
是否有任何简单的方法和更快的方法来获得结果数组,而无需迭代两次以提高性能

最佳答案

另一种方法是使用 id 作为键创建基值的 Map 并在第一个数组的映射中查找这些值

const bMap = new Map(arr2.map(e => [e.id, e.basis]))

const res = arr1.map(e => ({...e, basis : bMap.get(e.id) || 'Default' }))

console.log(res)
<script>
var arr1 = [{id: 1, name: 'A'},{id:2, name: 'B'},{id:3, name: 'C'},{id:4, name: 'D'},{id:5, name: 'E'}];
var arr2 = [{id: 1, basis: 'Online'},{id:3, basis: 'Paper'},{id:4, basis: 'Referrer'}];
</script>

关于javascript - 组合对象数组的特定属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63429697/

相关文章:

javascript - Jquery UI 数据表 : Add row to a table with textbox as column

arrays - 如何获取 const 数组的类型和值?

c - 寻找奇数的中间数

javascript - (节点:199408) DeprecationWarning: Collection#find: pass a function instead

javascript - 如何使用 slider 和调整大小属性调整图像大小

javascript - AngularJS:如何使用 ng-repeat 显示父数组中包含的数组的所有元素

c - C 中的有序数组初始化语法

javascript - "Uncaught Cannot extend unknown button type: copyHtml5"- 如何使用 `datatables.net-buttons-bs4`

javascript - Array.from 的时间复杂度

javascript - 解释箭头运算符系列