从json数组中获取特定的键

我试图从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'); });

我会在第一个解决方案中更改一件事情,即_.each()回调中的参数名称。 事实上,你只需要一个参数,就像第二个版本一样:

var arr = [];
_.each(a,function(o){
   arr.push(_.pick(o,'name','id'));
});

但是你使用_.map()第二种解决方案更好 - 非常干净,看起来非常好。

第一个版本实际上是如何在_.map()内部工作的。 以下是_.map()的源代码:

// 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()的版本只有输出中的idname

我唯一的补充建议是,如果你处理的是非常大的数组,它会比你自己做同样的_.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 };
}

但是对于一个小型的数组,你可以使用简单的代码。

链接地址: http://www.djcxy.com/p/79287.html

上一篇: Pluck specific keys from json array

下一篇: Java Swing graphics glitch?