【问题标题】:In JavaScript How to check array values exists in array of object without duplication在JavaScript中如何检查数组值是否存在于对象数组中而​​不重复
【发布时间】:2021-11-27 18:34:36
【问题描述】:

我有一个数组

let names = ['Devid', 'Aries','James'];

还有一个对象数组

let details = [
{"Name":"John"},
{"Name":"Devid"},
{"Name":"Aries"},
{"Name":"Aries"}
];

我想详细检查所有名称是否存在,并且它们在 1 个循环中的名称不重复 如果存在重复值,则将其计为 1 输出应该是 count= 2 但我的代码返回 count 3

 let names = ['Devid', 'Aries','James'];

 let details = [
    {"Name":"John"},
    {"Name":"Devid"},
    {"Name":"Aries"},
    {"Name":"Aries"}
    ];

let count = 0;

for (var eachDetail of details) {
     // checking here Name exist
     let isNameFound = names.some(el => eachDetail.Name.includes(el));
            if (isNameFound) count++;
        }
console.log(count);

// console.log(3) expected output 2

输出应该是2(因为Devid和Aries)存在

【问题讨论】:

  • 对于每个名称,过滤数组中匹配名称的元素,并验证过滤后数组的长度是否为 1。
  • 那么预期的输出是什么......
  • 输出应该是2(因为Devid和Aries)存在
  • 数组中是否可以重复?
  • 否,如果存在重复则计为 1

标签: javascript node.js arrays object


【解决方案1】:

这里有 2 个解决方案,filter() names 数组基于 details 中的存在。然后检索过滤后数组的长度。

检查details 中是否存在名称的一种方法是使用some()。只要回调的返回值为真,就会返回true

另一种方法是首先将details 的所有名称放在Set 中。这允许您将过滤器回调简化为name => detailNames.has(name)

const names = ["Devid", "Aries", "James"];
const details = [
  { "Name": "John"  },
  { "Name": "Devid" },
  { "Name": "Aries" },
  { "Name": "Aries" },
];

// solution #1
const count1 = names.filter((name) => (
  details.some(detail => detail.Name == name)
)).length;
console.log(count1);

// solution #2
const detailNames = new Set(details.map(detail => detail.Name));
const count2 = names.filter(name => detailNames.has(name)).length;
console.log(count2);

两种解决方案都假定names 不包含重复名称。

如果details 很小,第一个解决方案很可能更快。第二种解决方案的开销更大,但如果details 很大,则速度更快。这是因为some() 开始从头到尾迭代搜索项目,而has() 使用查找算法。

【讨论】:

    【解决方案2】:

    您应该能够使用.filter() 过滤数组,还可以使用.some().inlcude() 方法来验证非重复项。

    请在此处查看有关 JS 数组方法的文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

    let names = ['Devid', 'Aries','James'];
    let tempNames = [];
    
    let details = [
      {"Name":"John"},
      {"Name":"Devid"},
      {"Name":"Aries"},
      {"Name":"Aries"}
    ];
    
    var newDetails = details.filter(x => {
        let includeName = names.some(j => j == x.Name) && !tempNames.includes(x.Name);
        tempNames.push(x.Name);
        return includeName;
    });
    
    console.log(newDetails);

    【讨论】:

      【解决方案3】:

      您可以使用reduce 来计算数组中可以在对象值中找到的元素。您可以使用Set 删除重复项。

      let names = ['Devid', 'Aries','James'];
      
      let details = [
        {"Name":"John"},
        {"Name":"Devid"},
        {"Name":"Aries"},
        {"Name":"Aries"}
      ];
      
      const detailsNames = [...new Set(details.map(d => d.Name))];
      const count = [...new Set(names)].reduce((acc, el) => acc + detailsNames.includes(el), 0);
      
      console.log(count);

      【讨论】:

        【解决方案4】:

        你可以原型化 Array,然后遍历 names 数组

        Array.prototype._indexOfName = function(name){
          let n = 0;
          for(; n < this.length; n++)
            if(this[n].Name == name)
              return n
          return -1
        };
        
        let names = ['Devid', 'Aries','James'];
        let details = [
          {"Name":"John","Age":20},
          {"Name":"Devid","Age":23},
          {"Name":"Aries","Age":34},
          {"Name":"Aries","Age":50}
        ];
        let n = 0;
        let n2 = 0;
        for(; n < names.length; n++)
          if(details._indexOfName(names[n]) > -1)
            n2 ++
        alert('Found ' + n2 + ' matches')

        【讨论】:

          【解决方案5】:

          您可以简单地遍历 names 数组并执行 details.find(...) 操作。如果您在 details 中找到该对象,请将其添加到结果列表中。

          let names = ['Devid', 'Aries','James'];
          
          let details = [
            {"Name":"John"},
            {"Name":"Devid"},
            {"Name":"Aries"},
            {"Name":"Aries"}
          ];
          
          let result = [];
          names.forEach(name => {
            const object = details.find(detail => detail.Name === name);
            if (object) {
              result.push(object);
            }
          });
          
          console.log(result.length + ' entries found:');
          console.log(JSON.stringify(result, null, 2));

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-07-20
            • 2014-09-01
            • 2012-05-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-15
            相关资源
            最近更新 更多