我正在尝试从json数组中提取一些键值并形成另一个数组,下面是示例json结构.我现在有一个解决方案.只是想知道其他方法做同样的事情.
无论如何都要从对象数组中拒绝键.
输入
var a = [{ id: 1,name: "First Name",description: "" },{ id: 2,name: "Second Name",description: "" }]
产量
[{ id: 1,name: "First Name" },name: "Second Name" }]
一解决方案
var arr = []; _.each(a,function(key,value){ arr.push(_.pick(key,'name','id')); });
更新
二解决方案
_.map(a,function(o) { return _.pick(o,'id'); });
解决方法
我会在你的第一个解决方案中改变一件事,即_.each()回调中的参数名称.实际上你在这里只需要一个参数,就像第二个版本一样:
var arr = []; _.each(a,function(o){ arr.push(_.pick(o,'id')); });
但是你使用_.map()的第二个解决方案更好 – 非常干净,看起来非常好.
第一个版本实际上是_.map()在内部工作的方式.这是_.map()的source code:
// 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,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 }; }
但对于一个小型阵列,你可以选择更简单的代码.