我试图减去,即删除多个对象,即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);
答案 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()方法通过删除来更改数组的内容 现有元素和/或添加新元素。
以下代码段的工作方式与每个数组中元素的顺序无关,如下所示:
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;
我在运行代码here后修改了这个示例,结果改变了一些变量名。
答案 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);
});