如何使用另一个数组从数组中减去多个对象

时间:2017-10-15 18:14:13

标签: javascript arrays

我试图减去,即删除多个对象,即array1中找到的array2的对象,以便最终结果是array2只包含“jean”对象。

帮助!我输了。

我尝试了多次代码,如下例所示,但它没有用。

array1= [{"caracname" : "charles"}, {"caracname" : "kevin"}]
array2= [{"caracname" : "charles"}, {"caracname" : "kevin"}, {"caracname" : "jean"}]
            
            array1.forEach(function (k) {
                delete array2[k];
            });
            
            console.log(array2);

4 个答案:

答案 0 :(得分:2)

使用像Lodash这样的库来轻松一点:

var array1 = [{"caracname" : "charles"}, {"caracname" : "kevin"}];
var array2 = [{"caracname" : "charles"}, {"caracname" : "kevin"}, {"caracname" : "jean"}];

var array3 = _.differenceWith(array2, array1, _.isEqual);

console.log( JSON.stringify(array3) );

// or 
_.pullAllWith(array2, array1, _.isEqual);

console.log( JSON.stringify(array2) );
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

没有库的效率稍低(可能不适用于具有多个属性的对象):

var array1 = [{"caracname" : "charles"}, {"caracname" : "kevin"}];
var array2 = [{"caracname" : "charles"}, {"caracname" : "kevin"}, {"caracname" : "jean"}];

var j = JSON.stringify, array3 = array2.filter(e => array1.map(j).indexOf(j(e)) < 0);

console.log( j(array3) );

答案 1 :(得分:1)

以下是如何执行此操作:

function objectsEqual(o1, o2) {
    return o1.caracname === o2.caracname
}

function subtractArrays(a1, a2) {
    var arr = [];
    a1.forEach((o1) => {
       var found = false;
       a2.forEach((o2) => {
           if (objectsEqual(o1, o2)) {
                found = true;
           }  
       });
       if (!found) {
           arr.push(o1);
       }
    })
    return arr;
}

console.log(subtractArrays(array2, array1));

已修复为plunker:https://plnkr.co/edit/vA6oWg9R44f6k7ylyFh6?p=preview

答案 2 :(得分:1)

事实证明删除数组元素并不像删除变量那么容易;见here。 &#34;删除&#34;元素不会被删除,但会获取未定义的值,而数组的长度保持不变。

找到一些有用的建议here。因此,您可以使用array2&#39; splice方法,根据MDN方便地执行以下操作:

  

splice()方法通过删除来更改数组的内容   现有元素和/或添加新元素。

以下代码段的工作方式与每个数组中元素的顺序无关,如下所示:

&#13;
&#13;
var arr1 = [{
  "caracname": "charles"
}, {
  "caracname": "kevin"
}];

var arr2 = [{
  "caracname": "charles"
}, {
  "caracname": "jean"
}, {
  "caracname": "kevin"
}];

var tmp1 = "",
    tmp2 = "";

for (var k = 0, key = "", maxLength = arr1.length; k < maxLength; k++) {
  key = Object.keys(arr1[k])[0];
  
  for (var j = 0, maxLength_2 = arr2.length; j < maxLength_2; j++) {
  
    tmp2 = arr2[j][key];
    tmp1 = arr1[k][key];
  
  if (tmp2 === tmp1) {
      arr2.splice(j, 1);
      maxLength_2--; // array2 length now one less
      break;
    }// end if
  }// end inner-for
}// end outer-for

console.log(arr2);
&#13;
&#13;
&#13;

我在运行代码here后修改了这个示例,结果改变了一些变量名。

另外,您应该使用 var 或可选地声明您的数组;更多信息herehere

答案 3 :(得分:0)

使用此代码:[由@ slevy1建议]

var array1= [{"caracname" : "charles"}, {"caracname" : "kevin"}]
var array2= [{"caracname" : "charles"}, {"caracname" : "kevin"}, {"caracname" : "jean"}]

array1.forEach(function (k) {
    var index = array1.valueOf(k);
    array2.splice(index, 1);
});

array2.forEach(function (o) {
    console.log(o.caracname);
});

codepen link