[英]Javascript - filtering a list: how can I find an intersection between an array with objects including array and an array?
[英]How do I find the intersection of an array of arrays that contain objects using Javascript/underscorejs?
我无法弄清楚如何找到这组数组的交集:
[
[
{"name":"product1","light":"1"},
{"name":"product2","light":"2"},
{"name":"product5","light":"5"},
{"name":"product4","light":"4"}
],
[
{"name":"product2","light":"2"},
{"name":"product3","light":"3"},
{"name":"product4","light":"4"}
],[...more arrays with objects]
]
这只是样本数据 ,真实的集合我已经改变很多,但具有这种结构。 我希望返回的交集看起来像这样(交叉对象的单个数组):
[
{"name":"product2","light":"2"},
{"name":"product4","light":"4"},
]
我和LoDashjs以及Underscorejs一起尝试了这个:
_.intersectionObjects = _.intersect = function(array) {
var slice = Array.prototype.slice; // added this line as a utility
var rest = slice.call(arguments, 1);
return _.filter(_.uniq(array), function(item) {
return _.every(rest, function(other) {
//return _.indexOf(other, item) >= 0;
return _.any(other, function(element) { return _.isEqual(element, item); });
});
});
};
我需要这个,因为我正在尝试使用knockoutjs创建一个标签系统。 我有一个分类标签按钮的布局,在点击时写入“过滤器”可观察数组,唯一剩下的就是找到此可观察数组中包含的过滤产品的交集。
请帮帮我,我一直试图连续两天解决这个问题,但缺乏javascript知识来解决这个问题。 提前致谢!
尝试添加他们的申请方法:
var myArr = [
[
{"name":"product1","light":"1"},
{"name":"product2","light":"2"},
{"name":"product5","light":"5"},
{"name":"product4","light":"4"}
],
[
{"name":"product2","light":"2"},
{"name":"product3","light":"3"},
{"name":"product4","light":"4"}
]
]
_.intersectionObjects = _.intersect = function(array) {
var slice = Array.prototype.slice;
var rest = slice.call(arguments, 1);
return _.filter(_.uniq(array), function(item) {
return _.every(rest, function(other) {
return _.any(other, function(element) {
return _.isEqual(element, item);
});
});
});
};
var myIntersection = _.intersectionObjects.apply(_, myArr);
for (var i = 0; i < myIntersection.length; i++) {
console.log(myIntersection[i]);
}
// Sample Output:
// Object {name: "product2", light: "2"}
// Object {name: "product4", light: "4"}
这是我使用的方法似乎运作良好。
var arr1 = [{"id":"1"},{"id":"2"},{"id":"3"}]; var arr2 = [{"id":"1"},{"id":"3"}]; function match(item){ var isMatch = _.matcher(item); var matches = _.filter(arr2, isMatch); return matches[0]; } var matchArray = _.compact(_.map(arr1, function(val){ return match(val)})); document.write(JSON.stringify(matchArray));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
如果您只是比较对象本身,则可能会遇到错误,因为这将返回false:
var o1 = {"foo":"bar"};
var o2 = {"foo":"bar"};
return o1 == o2;
您需要比较对象内部的值,并根据这些值相交:
JSFiddle在这里做你喜欢的事。 http://jsfiddle.net/turiyag/bWrQW/6/
function valueIntersect(a1, a2) {
var aReturn = [];
for(i1 in a1) {
o1 = a1[i1];
for (i2 in a2) {
o2 = a2[i2];
if(equals(o1,o2)) {
aReturn.push(o1);
break;
}
}
}
return aReturn;
}
function equals(o1, o2) {
if (!o2 || o1.length != o2.length) {
return false;
}
for (i in o1) {
if (o1[i] !== o2[i]) {
return false;
}
}
return true;
};
根据https://lodash.com/docs#intersectionBy
_.intersectionBy([arrays], [iteratee=_.identity])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.