繁体   English   中英

比较两个对象数组并删除第二个对象数组中具有相同属性值的项目

[英]Compare two arrays of objects and remove items in the second one that have the same property value

我需要做的就是比较两个对象数组并删除第二个对象中具有相同属性值的项目。 例如:

var a = [{'name':'bob', 'age':22}, {'name':'alice', 'age':12}, {'name':'mike', 'age':13}];
var b = [{'name':'bob', 'age':62}, {'name':'kevin', 'age':32}, {'name':'alice', 'age':32}];

function remove_duplicates(a, b) {
    for (var i = 0, len = a.length; i < len; i++) {
        for (var j = 0, len = b.length; j < len; j++) {
            if (a[i].name == b[j].name) {
                b.splice(j, 1);
            }
        }
    }

    console.log(a);
    console.log(b);

}

console.log(a);
console.log(b);

remove_duplicates(a,b);

我不明白为什么这不起作用,而是给出:

Uncaught TypeError: Cannot read property 'name' of undefined

我期望的是 b 中的以下内容:

[{'name':'kevin', 'age':32}];

小提琴

 for (var i = 0, len = a.length; i < len; i++) { 
        for (var j = 0, len2 = b.length; j < len2; j++) { 
            if (a[i].name === b[j].name) {
                b.splice(j, 1);
                len2=b.length;
            }
        }
    }

除了使用两个循环,您还可以使用 findIndex 函数:

for (var i = 0, len = a.length; i < len; i++) {
    var ItemIndex = b.findIndex(b => b.name === a[i].name);

    a.splice(ItemIndex, 1)
}

或者如果你想完全不使用循环,你可以使用 forEach 函数

a.forEach(function(item, index, array) {
    var ItemIndex = b.findIndex(b => b.name === item.name);

    a.splice(ItemIndex, 1)
}

您的问题是, splice()将更改数组的长度,因此您预先计算的len值将太大,并且您尝试访问未定义元素的循环内部。

一个可能的解决方案是使用filter()方法:

function remove_duplicates(a, b) {

  b = b.filter( function( item ) {
      for( var i=0, len=a.length; i<len; i++ ){
          if( a[i].name == item.name ) {
              return false;
          }
      }
      return true;
  });

  console.log(a);
  console.log(b);
}

示例小提琴

您只需要在找到匹配项时中断内部循环:

if (a[i].name == b[j].name) {
    b.splice(j, 1);
    break;
}

试试这个:

您正在从0开始循环。

for (var i = 0, len = a.length; i < len; i++) {
        for (var j = 0, len = b.length; j < len-1; j++) {
            if (a[i].name == b[j].name) {
                b.splice(j, 1);
            }
        }
    }

小提琴演示

在对象数组中进行比较和删除。通常对象数据类型的数组可能是typeOf is object。所以我们需要转换成JSON stringify然后检查条件..

 for(var i=0; i < a.length; i++) { for(var j=0; j < b.length; j++) { if(JSON.stringify(a[i]) == JSON.stringify(b[j])) { a.splice(i, 1); } } }

根本原因是您在 for 循环中直接从数组 b 拼接项目,并且前提条件是 a 和 b 具有相同数量的项目。

let A = [
  {name: 'a', age: 20},
  {name: 'b', age: 30},
  {name: 'c', age: 10},
]

let B = [
  {name: 'a', age: 20},
  {name: 'b', age: 40},
  {name: 'd', age: 10},
  {name: 'e', age: 20},
  {name: 'f', age: 10},
]

const compareName = (obj1, obj2)=>{
  return (obj1.name === obj2.name);
}

const compareAll = (obj1, obj2)=>{
  return (obj1.name === obj2.name && obj1.age=== obj2.age);
}

let output = B.filter(b=>{
  let indexFound = A.findIndex(a => compareName(a, b));
  return indexFound == -1;
})

根据您要删除的对象使用:

  1. compareName :删除具有通用名称的对象
  2. compareAll :删除具有共同名称和年龄的对象

还要找到常见的对象列表,只需添加 use return index != -1

PS:请参阅我的Github中的 Javascript 数组数据操作示例

暂无
暂无

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

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