使用函数式编程过滤文字对象
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>
我想知道这个问题是否有函数式编程方法。我有一个文字对象和一些键:
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>