简体   繁体   English

根据与不同数组中 Object 的属性匹配的值,为数组中的每个 Object 添加属性

[英]Add a Property to Each Object in an Array Based on a Value Matching a Property of an Object in a Different Array

I have two arrays of objects:我有两个 arrays 对象:

const arr1 = [ {key: '12', name: 'john'}, {key: '9', name: 'steve'}, {key: '4', name: 'harry'}, {key: '2', name: 'jane'} ];

const arr2 = [ {key: '12', age: '29', gender: 'm'}, {key: '9', age: '43', gender: 'm'}, {key: '4', age: '19', gender: 'm'}, {key: '2', age: '65', gender: 'f'} ];

arr1 will always contain the same amount of objects as arr2 , and the key property will always be consistent, eg in the above example keys '12', '9', '4', '2' are present in both arrays. arr1将始终包含与arr2相同数量的对象,并且key属性将始终保持一致,例如在上面的示例中,键'12', '9', '4', '2'存在于 arrays 中。

I'm looking for an efficient way to add the name property from each object in arr1 to the object in arr2 that has the same value for the key property.我正在寻找一种有效的方法将name属性从arr1中的每个 object 添加到arr2中的 object 中,该属性具有相同的 key 属性值。 The above is a simplified example, in my use-case both arrays could potentially contain 300+ objects.以上是一个简化的示例,在我的用例中,arrays 都可能包含 300 多个对象。

Expected outcome:预期结果:

arr3 = [ {key: '12', age: '29', gender: 'm', name: 'john'}, {key: '9', age: '43', gender: 'm', name: 'steve'}, {key: '4', age: '19', gender: 'm', name: 'harry'}, {key: '2', age: '65', gender: 'f', name 'jane'} ];

I can achieve this with a nested loop that iterates over each object in arr1 and checks against each object in arr2 , but wondered if there was a simplified/more efficient way using some of the functions within the more recent versions of ECMAScript (which i'm still learning).我可以通过一个嵌套循环来实现这一点,该循环遍历arr1中的每个 object 并检查arr2中的每个 object ,但想知道是否有一种简化/更有效的方法使用较新版本的 ECMAScript 中的一些函数(我'我还在学习)。

Assuming that arr1 and arr2 are always the same length and sorted by their keys you can do this:假设 arr1 和 arr2 总是相同的长度并按它们的键排序,你可以这样做:

let arr3=arr2;
for (let i = 0;i<arr1.length;i++){
    arr3[i].name=arr1[i].name;
}

my output from doing this:我的 output 这样做:

[
  { key: '12', age: '29', gender: 'm', name: 'john' },
  { key: '9', age: '43', gender: 'm', name: 'steve' },
  { key: '4', age: '19', gender: 'm', name: 'harry' },
  { key: '2', age: '65', gender: 'f', name: 'jane' }
]

I hope this helps我希望这有帮助

 const arr1 = [ {key: '12', name: 'john'}, {key: '9', name: 'steve'}, {key: '4', name: 'harry'}, {key: '2', name: 'jane'} ]; const arr2 = [ {key: '12', age: '29', gender: 'm'}, {key: '9', age: '43', gender: 'm'}, {key: '4', age: '19', gender: 'm'}, {key: '2', age: '65', gender: 'f'} ]; const concat = arr1.concat(arr2); var arr3 = Object.values(concat.reduce((acc, {key, ...rest})=>{ acc[key] = {...(acc[key] || {}), ...{key, ...rest}}; return acc; },{})); console.log(arr3);

This will work.这将起作用。

 const arr1 = [ {key: '12', name: 'john'}, {key: '9', name: 'steve'}, {key: '4', name: 'harry'}, {key: '2', name: 'jane'} ]; const arr2 = [ {key: '12', age: '29', gender: 'm'}, {key: '9', age: '43', gender: 'm'}, {key: '4', age: '19', gender: 'm'}, {key: '2', age: '65', gender: 'f'} ]; arr2.map((elm, index) => { elm.name = arr1[index].name; }) console.log(arr2);

You can use Map to add name property您可以使用 Map 添加名称属性

 const arr1 = [ {key: '12', name: 'john'}, {key: '9', name: 'steve'}, {key: '4', name: 'harry'}, {key: '2', name: 'jane'} ]; const arr2 = [ {key: '12', age: '29', gender: 'm'}, {key: '9', age: '43', gender: 'm'}, {key: '4', age: '19', gender: 'm'}, {key: '2', age: '65', gender: 'f'} ]; map=new Map() arr1.map(o=>map.set(o.key,o)) arr2.forEach(o=>o.name=map.get(o.key).name) console.log(arr2)

 const arr1 = [ {key: '12', name: 'john'}, {key: '9', name: 'steve'}, {key: '4', name: 'harry'}, {key: '2', name: 'jane'} ]; const arr2 = [ {key: '12', age: '29', gender: 'm'}, {key: '9', age: '43', gender: 'm'}, {key: '4', age: '19', gender: 'm'}, {key: '2', age: '65', gender: 'f'} ]; function merge(arr1, arr2) { return arr1.reduce((merged, currentObj)=>{ const index = merged.findIndex(ele =>currentObj.key === ele.key); index?== -1. merged[index] = {..,merged[index]. ..:currentObj}. merged;push(currentObj), return merged }.arr2) } console,log(merge(arr1,arr2))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM