【问题标题】:Javascript Reduce Challenge, Getting the value of an Obj's KeyJavascript 减少挑战,获取 Obj 密钥的值
【发布时间】:2018-02-25 06:27:05
【问题描述】:

我正在学习在线课程,其中一个挑战是:

编写一个名为 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。

【问题讨论】:

  • 为什么是reduce,而不是map?另请注意,在您当前的实现中,extractKey 和 reduce 函数实际上都没有返回任何内容。
  • 该函数没有返回任何内容,您正在打印.push() 方法的返回值,而不是数组的内容。
  • 挑战是使用reduce。我已经用地图完成了。更新了问题。

标签: javascript


【解决方案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'))

【讨论】:

  • 我也这么认为(并删除了它)。
【解决方案2】:

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

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

或者,一个好的旧 for 循环可能更容易理解:

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

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

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

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

【讨论】:

  • console.log(push ...)?干什么用的?
【解决方案3】:

您非常接近,但使用 reduce 您必须在每次回调迭代后返回该值,因为只保存累加器的值

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

【讨论】: