在 JavaScript 中以功能方式提取 属性 和值

Extract property and value in a functional way in 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 循环部分,但无法弄清楚。任何人都可以对此有所了解。

简单的答案是使用 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));

你可能会这样做。它非常实用;

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);