javascript – 从json数组中获取特定的键

我正在尝试从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 };
}

但对于一个小型阵列,你可以选择更简单的代码.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...