簡體   English   中英

如何從另一個數組中減去多個對象

[英]How to Subtract Multiple Objects from an Array with Another array

我試圖減去,即刪除多個對象,即在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); 

使用Lodash類的庫要容易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) ); 

這是操作方法:

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));

已修復在插件中: https ://plnkr.co/edit/vA6oWg9R44f6k7ylyFh6 ? p = preview

事實證明,刪除數組元素並不像刪除變量那樣容易。 這里 “已刪除”元素不會被刪除,但是會在數組長度保持不變的情況下獲取未定義的值。

在這里找到了一些有用的建議。 因此,您可以使用array2的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); 

我在這里運行代碼后修改了此示例,因此更改了一些變量名稱。

順便說一句,您應該使用var或可選的let聲明數組。 更多信息在這里這里

使用此代碼:[由@ 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);
});

碼筆鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM