我不知道如何找到这组数组的交集:
[
[
{"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知识来解决它。提前感谢!
发布于 2013-02-06 08:13:16
如果您只是比较对象本身,则可能会遇到错误,因为这将返回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://stackoverflow.com/questions/14723412
复制相似问题