使用纯JavaScript,给定对象集合和过滤器对象,返回集合中具有与过滤器对象相同的键/值对的对象

时间:2016-07-29 16:43:25

标签: javascript function object collections filter

我有一个用于解决JavaScript中某个问题的伪代码,但我似乎无法理解如何将其转换为代码:

var sampleCollection = [
  { 'a': 1, 'b': 2, 'c': 3 },
  { 'a': 4, 'b': 5, 'c': 6 }
];

var sampleFilter = { 'a': 4, 'c': 6 };

function getCollectionFilter(collection,filter) {
    function collectionFilter(collection,filter) {
    //return if for each element in filter,
    //collection's key/value pair is same with filter's key/value pair
  }

  return collection.filter(collectionFilter);
}

getCollectionFilter(sampleCollection,sampleFilter);
// -> { 'a': 4, 'b': 5, 'c': 6};

我认为lodash有_.matches来解决这个问题,但我想知道为什么事情会以某种方式完成,如果不这样做会产生什么影响/后果。

在现实世界中提供有关解决方案/实践为何“最佳”的背景的奖励

2 个答案:

答案 0 :(得分:3)

使用 Array#filter Array#every 方法

var sampleCollection = [{
  'a': 1,
  'b': 2,
  'c': 3
}, {
  'a': 4,
  'b': 5,
  'c': 6
}];

var sampleFilter = {
  'a': 4,
  'c': 6
};

function getCollectionFilter(collection, filter) {
  // filter out elements and return
  return collection.filter(function(v) {
    // get all object keys 
    return Object.keys(filter)
      // use `every` method and check all values are equal
      .every(function(k) {
        // compare values
        return filter[k] == v[k];
      });
  })
}
console.log(
  getCollectionFilter(sampleCollection, sampleFilter)
);

使用ES6 arrow function,您可以将其设为一行。

var sampleCollection = [{
  'a': 1,
  'b': 2,
  'c': 3
}, {
  'a': 4,
  'b': 5,
  'c': 6
}];

var sampleFilter = {
  'a': 4,
  'c': 6
};

function getCollectionFilter(collection, filter) {
  return collection.filter(v => Object.keys(filter).every(k => filter[k] == v[k]))
}
console.log(
  getCollectionFilter(sampleCollection, sampleFilter)
);

答案 1 :(得分:0)

类似于Pranav C Balan的回答(打我一拳)......我只是使用过滤器工厂来创建传递给Array.prototype.filter的函数,而不是要求将集合作为参数并执行在实际比较值之前,预先检查是否存在匹配键。

let filterer = test => {
  let keys = Object.keys(test).sort();
  let keyMatch = new RegExp(keys.toString);
  return obj => {
    let objKeys = Object.keys(obj).sort().toString();
    return objKeys.match(keyMatch) && keys.every(k => test[k] === obj[k]);
  }
};

let passes = arrOfObjects.filter(filterer(testCase));
相关问题