编写函数以获取 key/value 对的对象和一个函数,并返回键匹配的值数组

Writing function to take object of key/value pairs and a function, and returning an array of values where key matches

我需要创建一个 javascript 函数,它接受一个 key/value 对的对象,并且 接受一个参数和 returns 布尔值的过滤器函数。该函数应该 return 一个包含来自对象的 values 的数组,filter(key) 为真。

所以我会有一个函数:

function filterValuesByKeys(obj, filter){
//returns array
}

我主要坚持的是基于键遍历对象,如果键 matched/satisfied 参数,则将值添加到数组。我可以打印所有的键,但我不知道如何在循环中单独获取每个键。

在遍历 JavaScript 对象时,您需要谨慎对待要完成的目标。使用 for (var key in obj) 将遍历所有键,以及对象原型链中的任何键。

仅获取对象的 "own" 属性的一种方法是使用 for/in,然后检查

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        //do stuff
    }
}

另一种更传统的循环方式是使用Object.keys(obj)获取obj自己的密钥。然后,您可以对该数组进行常规循环,甚至可以在其上使用 forEach

var keys = Object.keys(obj);
keys.forEach(function(key) {
    // do stuff 
});

还有一些其他巧妙的方法使用原生函数式数组方法,例如 reduce。我会把它留给你。

function customFilter(v) {
  return (v.indexOf('c') === 0);
}

function filterValuesByKeys(obj, filter) {
  var ary = [],
      keys = Object.keys(obj);
  keys.forEach(function(k) {
    if (filter(k)) {
      ary.push(obj[k]);
    }
  })
  return ary;
}

var person = {
  name: 'George',
  age: 50,
  address: '1 center st',
  city: 'some city',
  state: 'some state',
  country: 'USA'
};

var result = filterValuesByKeys(person, customFilter);

console.log(result);