首页 > 解决方案 > JS reduceRight 导致数组成为对象,我该如何修复逻辑?

问题描述

我有一个 json 对象:

json = {
    "array": [80, 50]
}

第三方jsoneditor,将路径变量作为字符串列表或值的索引返回。我使用事件侦听器来检测值的更改,并将这些更改存储在单独的对象中,以便稍后提交到表单。

例如,如果我更改5060,这就是返回的内容:

node.path = ["array", 1]
node.value = 60

reduceRight()通常将对象的更改映射到changed对象,但是当值是数组时,它会将数组转换为对象。

let delta = node.path.reduceRight((obj, elem) => ({[elem]: obj}), node.value)

//returns
delta = {array: {1: 60}}

//instead of 
delta = {array: [80, 60]}

如何检查原始json字段,如果字段是 Array 对象,不要将其缩减为对象,而是保留原始 Array 并使用 Array 中更改的值更新 Array?我需要将整个数组提交到表单中。

编辑: 我知道我可以在 reduce 中执行一些自定义逻辑来检查原始 json 并获取unchanged数组的一部分。我只是不知道如何实现

let delta = node.path.reduceRight( function (obj, elem) { 
    //some logic here to account for arrays and get original array list and change only slected index
    else { 
        return {[elem]: obj}), node.value 
    } 
});

编辑: 或者,我怎样才能从 中获取嵌套键node.path并找到原始数组,然后只更新数组索引?路径有时可以嵌套,因此路径始终是类似数组的结构。

//this does not work
let orig_key_val = json[node.path]

谢谢!

标签: javascriptarraysjsonobjectreduce

解决方案


这似乎有效,最后......我使用了一个常规reduce()并检查密钥是否是一个数组,如果它将我的原始数组存储到一个tmp对象中并保存该密钥。下次reduce()出现时,如果在index最后一个路径元素上,则将 设置tmp[tmp_key][key]为我的目标值并返回调整后的 Array对象。

我可以看到这对嵌套的 json 对象不起作用,但现在我没有任何......除非有人能告诉我如何弄清楚这是我现在的实现。

let tmp = {};
let tmp_key;
let delta = node.path.reduce((val, key, index, array) => {
    if (Array.isArray(json[key])) {
        tmp[key] = json[key]
        tmp_key = key;
    } else if (Object.keys(tmp).length !== 0 && index === node.path.length-1) {
        tmp[tmp_key][key] = node.value;
        return tmp
    } else
        return {[key]: val}

}, node.value);

推荐阅读