javascript - 使用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]
.
如何防止出现未定义的结果?
解决方案
您使用 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
}, [])
}
推荐阅读
- colors - SwiftUI 为图像着色但保留黑白
- python - LSTM 二进制分类
- java - JAVA Runnable 类启动线程有什么区别?
- python - python变量:从for循环中的变量读取值
- python - 如何防止在 numpy astype 中丢失纳秒
- python - Flask 跨多个请求存储大型数据帧
- firebase - 我不能在堆栈小部件中使用 flutter_swiper 出现渲染框错误?
- erlang - erlang library - 从另一个目录而不是 src (rebar3) 导出模块
- vue.js - 从路线导航时如何在vue中调用函数?
- android - 我已经使用带有导航抽屉的底部导航和片段