如何从一个数组中减去多个对象与另一个数组
我想要减去,即删除多个对象,即在array1中发现的array2的对象,以便最终结果是array2只包含“牛仔”对象。如何从一个数组中减去多个对象与另一个数组
帮助!我迷路了。
我尝试了多次代码,如下面的例子,但它没有奏效。
array1= [{"caracname" : "charles"}, {"caracname" : "kevin"}]
array2= [{"caracname" : "charles"}, {"caracname" : "kevin"}, {"caracname" : "jean"}]
array1.forEach(function (k) {
delete array2[k];
});
console.log(array2);
这里是如何做到这一点:
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
使用此代码:[由@ 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);
});
事实证明,删除一个数组元素并不像删除一个变量那样容易;见here。 “已删除”元素未被删除,但获取未定义的值,而数组长度保持不变。
找到了一些有用的建议here。所以,可以使用数组2的splice方法,该方法根据MDN轻易执行以下操作:
拼接()方法通过去除现有 元件和/或添加新元素改变的数组的内容。
下面的代码片断作品每个阵列中的元素的顺序无关,如下所示:
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);
我已经运行的代码here后修订本例中,改变一些变量名称作为结果。另外,您应该声明您的阵列为var或可选let;更多信息here和here。
“适当”的对象比较不容易https://stackoverflow.com/questions/1068834/object-comparison-in-javascript(这就是为什么我甚至没有在我的答案中尝试它,但只是比较他们的JSON字符串表示, Nayish只比较caracname属性的值)。在TypeScript https://www.typescriptlang.org/play/或类似的编辑器中粘贴JavaScript可能有助于注意到一些问题(不确定是否将Object.keys中的数组用作字符串[[key])是故意的) – Slai
@Slai感谢这个信息。我修复了代码,以便现在var key保存一个字符串值。测试过的代码现在看起来好了,当我在Typescript网站上运行它时。 – slevy1
A,与库等Lodash
容易一点:
array1 = [{"caracname" : "charles"}, {"caracname" : "kevin"}]
array2 = [{"caracname" : "charles"}, {"caracname" : "kevin"}, {"caracname" : "jean"}]
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>
或有点不太有效,而不库:
array1 = [{"caracname" : "charles"}, {"caracname" : "kevin"}]
array2 = [{"caracname" : "charles"}, {"caracname" : "kevin"}, {"caracname" : "jean"}]
j = JSON.stringify, array3 = array2.filter(e => array1.map(j).indexOf(j(e)) < 0)
console.log(j(array3))
可能[比较两个Javascript数组和删除重复项](https:// stackoverflow。com/questions/14930516/compare-two-javascript-arrays-and-remove-duplicates) –