javascript - 如何检查对象是否存在于多个数组中

标签 javascript

首先,感谢您阅读我的问题并尽力帮助我,并对我的英语表示歉意。

我的问题是我想实现一个很好的解决方案,在数组中使用更少的数组。

我有 n 个包含 n 个对象的数组,每个对象都有两个属性:名称和类型。我想知道如何获取所有重复数组中的对象。

这是我的代码:

let arraysNoEmpties = [...res].filter(array => array.length > 0);
let attributes = arraysNoEmpties[0].map(p => {
   return { name: p.name, type: p.type };
});

let items = getAtributeInAllArrays(attributes, arraysNoEmpties);
console.log('items: ', items);


const getAtributeInAllArrays = (properties, list) => {
    let items = [];
    for (let i = 0; i < properties.length; i++) {
        const property = properties[i];
        let numTimes = 0;
        for (let j = 0; j< list.length; j++) {
            const array = list[j];
            let propsOfarray = array.map(atr => atr.name);
            if (propsOfarray.indexOf(property.name) !== -1) {
                numTimes++;
                if (numTimes === list.length) {
                    items.push(property);
                }
            }
        }
    }
    items.sort((a,b) => (a.name > b.name) ? 1 : ((b.name > a.name) ? -1 : 0));
    return items;
};

最佳答案

如果您的数组长度相似,或者都非常小(<~20 个元素),您可以使用类似的方法。修改predicate函数来指定两个对象匹配的条件。例如,如果您添加另一个元素或决定即使没有 typename 也是唯一的。

function commonElements(arrays...) {
  const predicate = (obj1, obj2) => {
    return obj1.name == obj2.name && obj1.type == obj2.type;
  };

  return arrays[0].filter(e1 => !arrays.map(array => array.map(e2 => predicate(e1, e2)).includes(true)).includes(false));
}

如果您可能有一些明显较长的数组,请首先选择最短的数组作为过滤器的基础:

function commonElements(arrays...) {
  const predicate = (obj1, obj2) => {
    return obj1.name == obj2.name && obj1.type == obj2.type;
  };

  const lengths = arrays.map(arr => arr.length);
  const shortestArray = arrays[lengths.indexOf(lengths.sort((a, b) => a - b)[0])];

  return shortestArray.filter(e1 => !arrays.map(array => array.map(e2 => predicate(e1, e2)).includes(true)).includes(false));
}

两个示例的最后一行本质上是相同的,并且看起来稍长一些:

shortestArray.filter(e1 => {
  return !arrays.map(array => {
    return array.map(e2 => {
      return predicate(e1, e2);
    }).includes(true);
  }).includes(false);
});

对于过滤器数组的每个元素,使用 predicate 函数将其与每个其他数组中的每个元素进行比较。如果至少有一个元素匹配 (.includes(true)),则该数组将映射到 true。如果每个数组都映射到 true (! (...) .includes(false)),则该元素会被 .filter(...) .

关于javascript - 如何检查对象是否存在于多个数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54327959/

相关文章:

javascript - 根据选择打印多个输入字段

javascript - 在 jquery 循环中生成多个 div

javascript - 更改状态时延迟加载 Angular 组件脚本

Javascript 事件 addEventListener 为同一功能注册多次;使用 OOP Javascript

javascript - 将 wordpress 中的 javascript 与 wp-rocket 结合使用时,元素不会播放

javascript - 缩写时区正则表达式

javascript - 如何在IE8中包装attachEvent

javascript - html 的跨浏览器替代方案 = $ ('html' )

javascript - 使用 JavaScript 调用 mysql 数据库查询

javascript - 使用 setInterval 随着时间的推移减少变量