与第一个对象进行比较时,如何获取第二个对象数组的所有属性?

Posted

技术标签:

【中文标题】与第一个对象进行比较时,如何获取第二个对象数组的所有属性?【英文标题】:How to get all properties of the second array of objects when comparing with the first? 【发布时间】:2021-01-26 01:40:46 【问题描述】:

我正在使用带有 lodash 的 javascript,并且有两个对象数组,如下所示:

objArr1 = ['x': 1, 'y': 2, 'z': 3, 'x': 10, 'y': 20, 'z': 30, 'x': 100, 'y': 200, 'z': 300, 'x': 1000, 'y': 2000, 'z': 3000, 'x': 10000, 'y': 20000, 'z': 30000]

objArr2 = ['x': 1, 'y': 2, 'a': 5, 'x': 10, 'y': 20, 'a': 6, 'x': 100, 'y': 200, 'a': 9]

我将匹配键用作“x”并且我能够得到:

_.intersectionBy(objArr1, objArr2, 'x')

['x': 1, 'y': 2, 'z': 3, 'x': 10, 'y': 20, 'z': 30, 'x': 100, 'y': 200, 'z': 300]

但是,我还需要在第二个对象数组中获取“a”属性。

例如

['x': 1, 'y': 2, 'z': 3, 'a': 5, 'x': 10, 'y': 20, 'z': 30, 'a': 6, 'x': 100, 'y': 200, 'z': 300, 'a': 9]

似乎无法使用 lodash。

请帮忙!谢谢!

【问题讨论】:

与第一个比较时” - 以什么方式?比较规则是什么?是否“当x 属性具有相同值时从两个对象中获取所有属性”? 嗨兰迪,感谢您的关注。是的,你是对的。匹配基于 x 的值,但匹配对包含来自 objArr1 的 x、y 和 z 属性,但不包含来自 objArr2 的相应匹配对的键 'a'。 我遇到了类似的问题并且已经解决了。看看是否有帮助***.com/questions/64529536/… 感谢 Nishant 的分享。其实我能够得到匹配的一对。现在只是想弄清楚如何从第二个 obj 数组中获取“a”属性。例如['x': 1, 'y': 2, 'z': 3, 'a': 5, 'x': 10, 'y': 20, 'z': 30, 'a': 6, 'x': 100, 'y': 200, 'z': 300, 'a': 9] 【参考方案1】:

如果没有 lowdash,这将相对简单。以下combineArrays 函数接受一个键和任意数量的数组。它遍历这些数组并将任何值放入由所需键索引的对象中。最后,Object.values 抓取最终所需的数组。

const objArr1 = ['x': 1, 'y': 2, 'z': 3, 'x': 10, 'y': 20, 'z': 30, 'x': 100, 'y': 200, 'z': 300, 'x': 1000, 'y': 2000, 'z': 3000, 'x': 10000, 'y': 20000, 'z': 30000];

const objArr2 = ['x': 1, 'y': 2, 'a': 5, 'x': 10, 'y': 20, 'a': 6, 'x': 100, 'y': 200, 'a': 9];

function combineArrays(key, ...arrs) 
  const result = ;
  const counts = ;
  arrs.forEach(arr => 
    arr.forEach(el => 
      result[el[key]] =  ...result[el[key]], ...el ; 
      counts[el[key]] = (counts[el[key]] || 0) + 1;
    );
  );
  return Object.values(result).filter(obj => 
    counts[obj[key]] > 1
  );


console.log(
  combineArrays("x", objArr1, objArr2)
);

重要的是,如果任何数组之间有任何冲突,函数调用后面列出的数组将胜出。

【讨论】:

谢谢尼克。这似乎有效。但是也返回不匹配的对。 [ x: 1, y: 2, z: 3, a: 5 , x: 10, y: 20, z: 30, a: 6 , x: 100, y: 200, z: 300, a: 9 , x: 1000, y: 2000, z: 3000 , x: 10000, y: 20000, z: 30000 ] 只希望得到匹配的对。例如[ x: 1, y: 2, z: 3, a: 5 , x: 10, y: 20, z: 30, a: 6 , x: 100, y: 200, z: 300, a: 9 ] 感谢您的帮助! 太棒了。谢谢! 好的,该函数现在实现了count,并将filter 取出所有不出现多次的对象键。【参考方案2】:

使用_.keyBy() 根据xobjArr2 (objArr2Dict) 值创建对象字典。迭代交集的结果,并将每个项目与字典中的相应项目合并。

const objArr1 = ['x': 1, 'y': 2, 'z': 3, 'x': 10, 'y': 20, 'z': 30, 'x': 100, 'y': 200, 'z': 300, 'x': 1000, 'y': 2000, 'z': 3000, 'x': 10000, 'y': 20000, 'z': 30000]

const objArr2 = ['x': 1, 'y': 2, 'a': 5, 'x': 10, 'y': 20, 'a': 6, 'x': 100, 'y': 200, 'a': 9]

const objArr2Dict = _.keyBy(objArr2, 'x')

const result = _.map(
  _.intersectionBy(objArr1, objArr2, 'x'),
  o => ( ...o, ...objArr2Dict[o.x] )
)
  
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>

【讨论】:

以上是关于与第一个对象进行比较时,如何获取第二个对象数组的所有属性?的主要内容,如果未能解决你的问题,请参考以下文章

使用 2 个管道进行金属渲染,第二个对象与第一个对象重叠

需要将AoH中的一个值与第二个AoH中的另一个值进行比较

通过将第一个列表中的第一行项与第二个列表中的项进行比较来创建新列表

比较对象数组,最佳方式

如何将第二个表格视图的值与第一个表格视图的单击行的关系分开?

将基表值与第二个表的值之和与group by进行比较