繁体   English   中英

针对另一个对象数组过滤对象数组

[英]Filter object array against another object array

我有两个这样简化的数组。

var a = [{
 number: 1,
 name: "A"
}, {
 number: 2,
 name: "B"
}, {
 number: 3,
 name: "C"
}, {
 number: 4,
 name: "D"
}, {
 number: 5,
 name: "E"
}, {
 number: 6,
 name: "F"
}];

var b = [{
 number: 3,
 name: "C"
}, {
 number: 6,
 name: "F"
}];

我想要的是返回一个数组,其中a针对b进行过滤。 结果就是这样。

var result = [{
 number: 1,
 name: "A"
}, {
 number: 2,
 name: "B"
}, {
 number: 4,
 name: "D"
}, {
 number: 5,
 name: "E"
}];

在堆栈溢出中查看了很多其他解决方案,但无法使其正常工作。

我可以使用下划线之类的库。

通过单行解决方案用lodash可以实现。

 var a = [{ number: 1, name: "A" }, { number: 2, name: "B" }, { number: 3, name: "C" }, { number: 4, name: "D" }, { number: 5, name: "E" }, { number: 6, name: "F" }]; var b = [{ number: 3, name: "C" }, { number: 6, name: "F" }]; var result = _.differenceWith(a, b, _.isEqual); console.log(result) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script> 

您可以使用Array#filter 像这样:

const filterData = (a,b) => {
    return a.filter( (itemA) => {
        return b.some( (itemB) => { 
            return (itemA.number === itemB.number); 
         });
  });
}

我只是创建了一个小提琴来测试代码: https : //jsfiddle.net/mrlew/pb1qqeyd/3/ (您必须打开控制台来检查结果)。

或者...单行:

const filterData = (a,b) => a.filter( (itemA) => b.some( (itemB) => (itemA.number === itemB.number) ) );

编辑 :感谢@kzh建议,已编辑使用.some

var a = [{
 number: 1,
 name: "A"
}, {
 number: 2,
 name: "B"
}, {
 number: 3,
 name: "C"
}, {
 number: 4,
 name: "D"
}, {
 number: 5,
 name: "E"
}, {
 number: 6,
 name: "F"
}];

var b = [{
 number: 3,
 name: "C"
}, {
 number: 6,
 name: "F"
}];

var _ = require('lodash');
var result = _.differenceBy(a,b,'name');

有关更多信息,请参阅Lodash文档: https ://lodash.com/docs/#differenceBy

您可以使用JavaScript中的内置filter功能来过滤另一个数组,请检查以下代码段。

 var a = [{ number: 1, name: "A" }, { number: 2, name: "B" }, { number: 3, name: "C" }, { number: 4, name: "D" }, { number: 5, name: "E" }, { number: 6, name: "F" }]; var b = [{ number: 3, name: "C" }, { number: 6, name: "F" }]; var result = a.filter(function(currentValue, index, arr) { var found = false; for (var i = 0; i < b.length; i++) { if (currentValue.number === b[i].number) { found = true; break; } } if (!found) { return currentValue; } }); console.log(result); 

您可以使用普通JavaScript使用filter()some()every()来做到这一点。

 var a = [{"number":1,"name":"A"},{"number":2,"name":"B"},{"number":3,"name":"C"},{"number":4,"name":"D"},{"number":5,"name":"E"},{"number":6,"name":"F"}] var b = [{"number":3,"name":"C"},{"number":6,"name":"F"}] var result = a.filter(function(o) { return !b.some(function(e) { return Object.keys(o).length == Object.keys(e).length && Object.keys(o).every(function(k) { return e[k] == o[k] }) }) }) console.log(result) 

var v1 = JSON.parse(a);
var v2 = JSON.parse(b);

var v3 = [] ;


function objectEquals(v1, v2) {

    if (typeof(v1) !== typeof(v2)) {
        return false;
    }
if (v1 instanceof Object && v2 instanceof Object) {

  for (k in v1) {
            r = objectEquals(v1[k], v2[k]);
            if (!r) {
              v3.push(v1[k]);  

            }
        }



}

}

// call the above method passing your two object, and return a new unique array


objectEquals(v1, v2) ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM