Lodash JS - Simulate' _.contactWith'在普通的香草Javascript?

时间:2016-06-29 20:00:25

标签: javascript lodash

如何为' _.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)迭代,有没有办法做到这一点?

感谢您的帮助。

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;
  };

唯一的依赖项_.containsgetLength也非常简单。