使用函数式编程过滤文字对象

Filtering literal object using functional programming

我想知道这个问题是否有函数式编程方法。我有一个文字对象和一些键:

var obj= {'a':20, 'b':44, 'c':70};
var keys = ['a','c'];

我想获得:

{'a':20', 'c':70}

但是没有 for 循环。我试过了:

_.object(keys, ._map(keys, function(key){return obj[key];}))

给出结果,但看起来很复杂..

你可以用 .reduce():

var extracted = keys.reduce(function(o, k) {
  o[k] = obj[k];
  return o;
}, {});

.reduce() 方法(在某些其他语言中称为 "inject" 或 "fold")遍历数组的值。每个都与作为第二个参数传递的初始值一起传递给函数。该函数对每个数组条目和 returns 将在下一次迭代中传递的值做任何它需要做的事情。

上面的模式非常典型:从一个空对象开始,然后在每次函数调用时添加它。

由于您使用 underscore.js,请尝试方法 _.pick(),它是专门为此实现的:

var obj = {
  'a': 20,
  'b': 44,
  'c': 70
};
var keys = ['a', 'c'];

console.log( _.pick(obj, keys) );
// Object {a: 20, c: 70}
<script src="http://underscorejs.org/underscore-min.js"></script>