从json数组中提取特定键

tom*_*lex 8 javascript underscore.js

我试图从json数组中取出一些键值并形成另一个数组,下面是示例json结构.我现在有一个解决方案.只是想知道其他方法做同样的事情.

无论如何要拒绝来自对象数组的键.

输入

 var a = [{
   id: 1,
   name: "First Name",
   description: ""
 },{
   id: 2,
   name: "Second Name",
   description: ""
 }]
Run Code Online (Sandbox Code Playgroud)

产量

 [{
   id: 1,
   name: "First Name"
 },{
   id: 2,
   name: "Second Name"
 }]
Run Code Online (Sandbox Code Playgroud)

一解决方案

var arr = [];
_.each(a,function(key,value){
   arr.push(_.pick(key,'name','id'));
});
Run Code Online (Sandbox Code Playgroud)

更新

二解决方案

 _.map(a, function(o) { return _.pick(o, 'name','id'); });
Run Code Online (Sandbox Code Playgroud)

Ali*_*118 7

我们也可以使用Vanilla JS包括map,destructuring assignmentarrow function

const a = [
  {
    id: 1,
    name: "First Name",
    description: ""
  },
  {
    id: 2,
    name: "Second Name",
    description: ""
  }
]


// we need only id and name
const result = a.map(({id, name})=>({id, name}))


// result:
[
  {
    id: 1,
    name: "First Name"
  },
  {
    id: 2,
    name: "Second Name"
  }
]
Run Code Online (Sandbox Code Playgroud)


Mic*_*ary 4

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

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

但你使用的第二个解决方案_.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;
};
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它的代码与您的第一个版本基本相同,并且还添加了一些额外的内容。

您询问了拒绝钥匙的问题;您可以使用该_.omit()函数来做到这一点,这与 相反_.pick():您列出要省略的属性名称,而不是要复制的属性名称。因此,对于您的测试数据,这将产生与其他版本相同的结果:

_.map(a, function(o) { return _.omit(o, 'description'); });
Run Code Online (Sandbox Code Playgroud)

不同之处在于,如果输入数据中有其他属性,此版本也会将这些属性复制到输出中。使用的版本在输出中_.pick()仅包含id和。name

_.pick()我唯一的额外建议是,如果您正在处理非常大的数组,那么自己做同样的事情会更快一些:

var result = _.map( a, function( o ) {
    return { name: o.name, id: o.id };
});
Run Code Online (Sandbox Code Playgroud)

或者使用你自己的循环更快:

var result = [];
for( var i = 0, n = a.length;  i < n;  ++i ) {
    var o = a[i];
    result[i] = { name: o.name, id: o.id };
}
Run Code Online (Sandbox Code Playgroud)

但对于较小的数组,您也可以使用更简单的代码。