JS reduceRight是导致数组成为对象,我怎么能修复逻辑?



有一个json对象:

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

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

例如,如果我将50更改为60,返回的结果如下:

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,如果字段是一个数组对象,不要减少到一个对象,但保持原来的数组和更新数组与数组内改变的值?我需要将整个数组提交到表单中。

编辑:我知道我可以在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]

谢谢!

这似乎工作,最后…我使用了一个常规的reduce(),并检查键是否是一个数组,如果它将我的原始数组存储到tmp对象中并保存该键。下一次reduce()出现时,如果index在最后一个path元素上,那么将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);

相关内容

最新更新