在对象数组的数组中查找交叉点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在对象数组的数组中查找交叉点相关的知识,希望对你有一定的参考价值。

假设我有以下包含对象数组(歌曲)的数组:

[
  [
    {
      name: 'I Want You Back',
      id: 1
    },
    {
      name: 'ABC',
      id: 2
    }
  ],
  [
    {
      name: 'I Want You Back',
      id: 1
    },
    {
      name: 'Dont Stop Me Now',
      id: 3
    }
  ],
  [
    {
      name: 'I Want You Back',
      id: 1
    },
    {
      name: 'ABC',
      id: 2
    }
  ],
]

我希望遍历我的数据并返回在每个数组中找到的对象,因此在这种情况下,返回值将是:

{
   name: 'I Want You Back',
   id: 1
}

到目前为止,我只是设法用于字符串数组,而不是对象,如下所示:

const arrays = [
  ['I Want You Back', 'ABC'],
  ['I Want You Back', 'Dont stop me now'],
  ['I Want You Back', 'ABC']
];

const result = arrays.shift().filter((v) => {
  return arrays.every((a) => {
    return a.indexOf(v) !== -1;
  });
});

// result = ["I Want You Back"]

我一直在尝试,但我不能设法对我的对象(以及他们的名字或id)应用相同的逻辑。如果你们中的一些人告诉我你将如何做,我真的很感激。

答案

您可以通过唯一的id计算对象然后通过查找计数与数组长度相同的对象:

const songs = [[{name: 'I Want You Back',id: 1},{name: 'ABC',id: 2}],[{name: 'I Want You Back',id: 1},{name: 'Dont Stop Me Now',id: 3}],[{name: 'I Want You Back',id: 1},{name: 'ABC',id: 2}],]

// count of each unique id
let counts  = songs.reduce((count, arr) => {
  arr.forEach(obj => {
    if (!count[obj.id]) count[obj.id] = {obj, count: 0}
    count[obj.id].count += 1  
  })
  return count
}, {})

// now filter out all whose count isn't the length
// and map to retreive just the object
let intersect = Object.values(counts)
                .filter(o => o.count == songs.length)
                .map(o => o.obj)

console.log(intersect)

以上是关于在对象数组的数组中查找交叉点的主要内容,如果未能解决你的问题,请参考以下文章

两个数组交叉合并为一个数组

错误代码:错误域 = NSCocoaErrorDomain 代码 = 3840“JSON 文本没有以数组或对象和允许未设置片段的选项开头。”

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段

用 inArray 查找数组中的对象

使用 Jquery Each 在 Javascript 对象和数组中查找匹配项

查找 MySQL JSON 对象或数组的交集