我正在尝试从json数组中提取一些键值并形成另一个数组,下面是示例json结构。我现在有一个解决方案。只是想知道其他方法是做什么的。
无论如何都要拒绝来自对象数组的键。
输入
var a = [{
id: 1,
name: "First Name",
description: ""
},{
id: 2,
name: "Second Name",
description: ""
}]
输出
[{
id: 1,
name: "First Name"
},{
id: 2,
name: "Second Name"
}]
一种解决方案
var arr = [];
_.each(a,function(key,value){
arr.push(_.pick(key,'name','id'));
});
已更新
第二个解决方案
_.map(a, function(o) { return _.pick(o, 'name','id'); });
答案 0 :(得分:4)
我会在你的第一个解决方案中改变一件事,即_.each()
回调中的参数名称。实际上,这里只需要一个参数,就像第二个版本一样:
var arr = [];
_.each(a,function(o){
arr.push(_.pick(o,'name','id'));
});
但是使用_.map()
的第二个解决方案更好 - 非常干净,看起来非常好。
第一个版本实际上是_.map()
内部的工作方式。这是_.map()
的{{3}}:
// Return the results of applying the iterator to each element.
// Delegates to **ECMAScript 5**'s native `map` if available.
_.map = _.collect = function(obj, iterator, context) {
var results = [];
if (obj == null)
return results;
if (nativeMap && obj.map === nativeMap)
return obj.map(iterator, context);
each(obj, function(value, index, list) {
results.push(iterator.call(context, value, index, list));
});
return results;
};
正如您所看到的,它与您的第一个版本的代码基本相同,还有一些额外的内容。
你问过拒绝钥匙;您可以使用_.omit()
函数执行此操作,该函数与_.pick()
相反:您列出要省略的属性名称,而不是要复制的属性名称。因此,对于您的测试数据,这将产生与其他版本相同的东西:
_.map(a, function(o) { return _.omit(o, 'description'); });
不同之处在于,如果输入数据中有其他属性,则此版本也会将这些属性复制到输出中。使用_.pick()
的版本在输出中只有id
和name
。
我唯一的另一个建议是,如果你要处理非常大的数组,那么自己做_.pick()
相当于快一点:
var result = _.map( a, function( o ) {
return { name: o.name, id: o.id };
});
使用自己的循环甚至更快:
var result = [];
for( var i = 0, n = a.length; i < n; ++i ) {
var o = a[i];
result[i] = { name: o.name, id: o.id };
}
但是对于一个小型数组,您可以使用更简单的代码。