根据另一个对象数组过滤对象数组
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"
}];
我想要的是 return 一个数组,其中 a 根据 b 进行过滤。所以结果是这样的。
var result = [{
number: 1,
name: "A"
}, {
number: 2,
name: "B"
}, {
number: 4,
name: "D"
}, {
number: 5,
name: "E"
}];
在这里查看了很多关于堆栈溢出的其他解决方案,但无法使其发挥作用。
我可以使用像下划线这样的库。
您可以使用 Array#filter。类似的东西:
const filterData = (a,b) => {
return a.filter( (itemA) => {
return b.some( (itemB) => {
return (itemA.number === itemB.number);
});
});
}
我刚刚创建了一个 fiddle 来测试代码:https://jsfiddle.net/mrlew/pb1qqeyd/3/(您必须打开控制台才能检查结果)。
或者...在one-line中:
const filterData = (a,b) => a.filter( (itemA) => b.some( (itemB) => (itemA.number === itemB.number) ) );
编辑:感谢@kzh 的建议,编辑为使用.some。
可以通过one-line解决方案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>
您可以使用 filter()
、some()
和 every()
.
用普通的 javascript 来做到这一点
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) ;
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 中的 in-built 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);
我有两个像这样简化的数组。
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"
}];
我想要的是 return 一个数组,其中 a 根据 b 进行过滤。所以结果是这样的。
var result = [{
number: 1,
name: "A"
}, {
number: 2,
name: "B"
}, {
number: 4,
name: "D"
}, {
number: 5,
name: "E"
}];
在这里查看了很多关于堆栈溢出的其他解决方案,但无法使其发挥作用。
我可以使用像下划线这样的库。
您可以使用 Array#filter。类似的东西:
const filterData = (a,b) => {
return a.filter( (itemA) => {
return b.some( (itemB) => {
return (itemA.number === itemB.number);
});
});
}
我刚刚创建了一个 fiddle 来测试代码:https://jsfiddle.net/mrlew/pb1qqeyd/3/(您必须打开控制台才能检查结果)。
或者...在one-line中:
const filterData = (a,b) => a.filter( (itemA) => b.some( (itemB) => (itemA.number === itemB.number) ) );
编辑:感谢@kzh 的建议,编辑为使用.some。
可以通过one-line解决方案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>
您可以使用 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) ;
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 中的 in-built 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);