首页 > 解决方案 > 减少函数给出“未捕获的类型错误:无法设置未定义的属性‘标题’”

问题描述

我正在尝试使用 reduce 函数在 javascript 中重塑 JSON 对象。

据我了解,每次在 javascript 中向对象添加新属性时,都必须将其声明为ac['new_object'] = {};. 我正在这样做,所以我不明白为什么我会看到错误:Uncaught TypeError: Cannot set property 'title' of undefined

可重现的例子:

let field_list = [
    {
        "key": "id",
        "val": {
            "boost": 4
        }
    },
    {
        "key": "title",
        "val": {
            "boost": 4
        }
    }
]

field_list.reduce(function(ac, cu){
    ac[cu.key] = {}
    ac[cu.key] = cu.val
}, {})

我怎样才能正确地减少这个 JSON 对象?我的错误是什么?

目标格式:

{
    tales: {
        foo: {"id": 2},
        bar: {"title": 1},
        ...
    }
}

标签: javascript

解决方案


不要忘记在函数末尾返回累加器对象:

field_list.reduce(function(ac, cu){
  ac[cu.key] = {}
  ac[cu.key] = cu.val
  return ac; // <---- added return statement
}, {})

没有它,undefined将隐式返回,因此循环的下一次迭代将ac等于undefined


推荐阅读