2016-08-03 41 views
1

考虑我们有一个数组,其中包含我们希望从对象数组中提取其值的对象的所有属性。每个对象的形式。在JavaScript中以功能方式提取属性和值

var keys = ['name', 'age']; 

假设我们有一群学生。学生对象看起来像:

var student = {name:"Sarah", age:"20", address:"123 Main St."}; 

我们有一群学生。

使用下面的代码来提取我们感兴趣的每个学生的属性和值。我们感兴趣的属性是我们上面提到的关键。

function pluck(keys) { 
    return function(students) { 
     return students.map(i => { 
      var ex = {}; 
      for (var k = 0; k < keys.length; k++) { 
       if (i.hasOwnProperty(keys[k])) { 
        ex[keys[k]] = i[keys[k]]; 
       } 
      } 
      return ex; 
     }); 
    }; 
} 

我觉得这是特别for循环使用部分功能,箭头,但不能想出解决办法这样做的更好,更简单的方法。任何人都可以对此有所了解。

+0

如果你有 '项目',我想你的意思是 '学生'(反之亦然)。实际答案分开。 –

+0

我想我的第一个问题是'物品'是什么。它看起来像什么。我假设'学生'是你的预期产出? –

+0

谢谢@SMcCrohan。我做了更正。 – Vahid

回答

1

你可以做这样的申请对象的数组。它非常实用;

var keys = ["name","age"], 
 
students = [{name:"Sarah", age:"20", address:"123 Main St."}, 
 
      {name:"Janet", age:"21", address:"123 Main St."}, 
 
      {name:"Peter", age:"22", address:"123 Main St."}, 
 
      {name:"Jesse", age:"19", address:"123 Main St."}, 
 
      {name:"Marla", age:"20", address:"123 Main St."} 
 
      ], 
 
    result = students.reduce((p,c) => p.concat(keys.reduce((o,k) => Object.assign(o,{[k]: c[k]}),{})),[]); 
 
console.log(result);

1

简单的答案是使用普通模式使用reduce从单个对象引出性能和使用map

function selectFromArray(array, keys) { 
 
    return array.map(function(item) { 
 
    return keys.reduce(function(o, k) { 
 
     o[k] = item[k]; 
 
     return o; 
 
    }, {}); 
 
    }); 
 
} 
 

 
var keys = ['age', 'name']; 
 
var students = [{age: 5,name: 'joe',sex: 'm'}, {age: 6,name: 'sue',sex: 'f'}]; 
 
var subset = selectFromArray(students, keys); 
 
alert(JSON.stringify(subset));