Javascript减少挑战,获得Obj键的价值

时间:2018-02-24 22:08:24

标签: javascript

我在线上课,其中一个挑战是:

编写一个名为extractKey的函数,它接受两个参数,一个对象数组和一个键的名称,并返回一个只包含该键值的数组:你必须使用reduce。

extractKey([{name: "Elie", isInstructor:true},{name: "Tim", isInstructor:true},{name: "Matt", isInstructor:true}], "name");

// ["Elie", "Tim", "Matt"]

我以为我可以这样做:

function extractKey(arr, key) {
  arr.reduce(function(a, b) {
    console.log(a.push(b[key]))
  }, [])
}

但它返回1.我有一个大概的想法将每个值推入空数组,但是当控制台记录每个值时,a将在下一个累加器返回undefined。

3 个答案:

答案 0 :(得分:1)

如果你必须使用reduce,那么我会将它与concat结合使用。

var arr = [{
  name: "Elie",
  isInstructor: true
}, {
  name: "Tim",
  isInstructor: true
}, {
  name: "Matt",
  isInstructor: true
}]

function extractKeys(array, key) {
  return array.reduce((acc, obj) => {
    return acc.concat(obj[key])
  }, [])
}

console.log(extractKeys(arr, 'name'))

答案 1 :(得分:0)

如果你使用reduce(这里不是必需的),你需要传递累加器:

 function extractKey(arr, key) {
    arr.reduce(function(acc, el) {
      console.log(a.push(el[key]))
      return acc; // <--
    }, [])
 }

另外,一个好的旧循环可能更容易理解:

  function extractKey(arr, key){
    const result = [];  
    for(const el of arr)
      result.push(el[key]);     
    return result;
 }

最后你也可以使用 map 代替curry来美化它:

  const extract = key => obj => obj[key];

  const result = original.map(extract("name"));

答案 2 :(得分:0)

你非常接近但是在减少后你必须在每次回调迭代后返回值,因为只保存了累加器的值

function extractKey(arr, key) {
  arr.reduce(function(a, b) {
    a.push(b[key])
    console.log(a)
    return a;
  }, []);
}