3

我有两个这样的对象数组:

var arr1 = [{Id: 1, Name: "Test1"}, {Id: 2, Name: "Test2"}, {Id: 3, Name: "Test3"}, {Id: 4, Name: "Test4"}]

var arr2 = [{Id: 1, Name: "Test1"}, {Id: 3, Name: "Test3"}]

我需要比较两个数组Id的元素并从中删除arr1未出现的arr2元素(没有元素Id)。我怎样才能做到这一点 ?

4

3 回答 3

11
var res = arr1.filter(function(o) {
    return arr2.some(function(o2) {
        return o.Id === o2.Id;
    })
});

垫片,垫片,垫片。

于 2013-02-20T15:34:46.100 回答
8

您可以使用接受任意数量数组的函数,并仅返回所有数组中存在的项目。

function compare() {
    let arr = [...arguments];
    return arr.shift().filter( y => 
        arr.every( x => x.some( j => j.Id === y.Id) )
    )
}

var arr1 = [{Id: 1, Name: "Test1"}, {Id: 2, Name: "Test2"}, {Id: 3, Name: "Test3"}, {Id: 4, Name: "Test4"}];
var arr2 = [{Id: 1, Name: "Test1"}, {Id: 3, Name: "Test3"}, {Id: 30, Name: "Test3"}];
var arr3 = [{Id: 1, Name: "Test1"}, {Id: 6, Name: "Test3"}, {Id: 30, Name: "Test3"}];

var new_arr = compare(arr1, arr2, arr3);
console.log(new_arr);

function compare() {
	let arr = [...arguments]
	
	return arr.shift().filter( y => 
  	arr.every( x => x.some( j => j.Id === y.Id) )
  )
}

于 2013-02-20T15:32:52.257 回答
3

使用散列(一个集合)将获得性能提升:

var arr1 = [{Id: 1, Name: "Test1"}, {Id: 2, Name: "Test2"}, 
            {Id: 3, Name: "Test3"}, {Id: 4, Name: "Test4"}];

var arr2 = [{Id: 1, Name: "Test1"}, {Id: 3, Name: "Test3"}];

arr1 = arr1.filter(function (el) {
    return this.has(el.Id);
}, new Set(arr2.map(el => el.Id)));

console.log(arr1);

创建了一个新的Set ,它从以下位置获取Idarr2

"1","3"

该 Set 作为 to 传递thisArg因此filterfilter回调中它可以作为this.

于 2016-06-19T18:14:57.143 回答