首页 > 解决方案 > 使用reduce方法从对象中提取信息

问题描述

我正在尝试使用 reduce 数组方法从对象中提取键值并返回一个仅包含列出的值的新数组。这是我的代码:

function extractValue(arr, key) {
  let newArr = []
  return arr.reduce(function(accum, nextVal) {
    if(nextVal !== key)
      newArr.push(accum[key] + ', '+ nextVal[key])
      return newArr
  })
}

let data = [ { name: 'bob'   }
           , { name: 'jim'   }
           , { name: 'sarah' }
           , { age: 100      }
           ]
console.log( extractValue(data, 'name'))

出于某种原因,当我将我的函数记录到控制台时,我的结果一直是这样的,
["bob", "jim", undefined, "Sarah", undefined, undefined].
如何防止出现未定义的结果?

标签: javascript

解决方案


您使用 reduce 的方式不太正确......它应该更像:

arr.reduce(function(accum, item) {

}, defaultValue);

无论条件如何,每次迭代都必须返回累加器。

当你想返回另一个数组时,你的 defaultValue 是一个空数组是有意义的:

arr.reduce(function(accum, item) {

}, []);

总体而言,将起作用的代码将类似于以下内容:

function extractValue(arr, key) {
  return arr.reduce(function(accum, item) {
    if (!item[key]) {
      return accum;  // <--- we must still return the accumulator
    }

    accum.push(item[key])
    return accum;  // <---- and return accumulator here also
  }, [])
}

推荐阅读