如何为' _.transportWith'编写等效的简单Javascript方法。 LodashJs库的方法
var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
_.intersectionWith(objects, others, _.isEqual);
Output: [{ 'x': 1, 'y': 2 }]
我希望它也适用于字符串数组。没有O(n ^ 2)迭代,有没有办法做到这一点?
感谢您的帮助。
答案 0 :(得分:1)
这是_.intersectionWith
的高功能,简单JS实现:
var objects = [{'x':1,'y':2},{'x':2,'y':1}],
others = [{'x':1,'y':1},{'x':1,'y':2}];
function isEqual(a, b) {
return JSON.stringify(a) === JSON.stringify(b);
}
function intersectionWith(firstArray) {
var otherArrays = Array.prototype.slice.call(arguments, 1, -1),
comparator = arguments[arguments.length - 1];
return firstArray.filter(function(a) {
return otherArrays.every(function(arr) {
return arr.some(function(b) {
return comparator(a, b);
});
});
});
}
console.log(intersectionWith(objects, others, isEqual));

在ES6中,如果允许比较器作为第一个参数,则可以更短。
function intersectionWith() {
var [comp, first, ...others] = [...arguments];
return first.filter(a => others.every(arr => arr.some(b => comp(a, b))));
}
答案 1 :(得分:0)
UnderscoreJS的注释源有一个相当普遍的交叉实现:
http://underscorejs.org/docs/underscore.html#section-62
_.intersection = function(array) {
var result = [];
var argsLength = arguments.length;
for (var i = 0, length = getLength(array); i < length; i++) {
var item = array[i];
if (_.contains(result, item)) continue;
for (var j = 1; j < argsLength; j++) {
if (!_.contains(arguments[j], item)) break;
}
if (j === argsLength) result.push(item);
}
return result;
};
唯一的依赖项_.contains
和getLength
也非常简单。