javascript - 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
字段,如果字段是 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]
谢谢!
解决方案
这似乎有效,最后......我使用了一个常规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);
推荐阅读
- c++ - 在 gdb 中:在启动过程中程序以代码 1 退出。在 GDB 之外运行良好
- bash - 如何从文件中的一行复制值并使用 Shell 将其粘贴到新文件中?
- javascript - 无法解析“create-react-class”
- vba - vba xlrunningtotal 不工作
- hyperledger-fabric - Hyperledger Fabric 共识
- docker - 在另一个容器 docker 中执行另一个容器命令
- python - 在执行命令之前,Python 3 TKinter 窗口不会打开
- angular - AngularFireStorage 图片上传
- node.js - 在 NodeJs 中合并一个非常大的列表的最佳方法是什么?
- javascript - 在 map() 内的 React 中回调 setState