JS reduceRight 导致数组成为对象,我该如何修复逻辑?
Posted
技术标签:
【中文标题】JS reduceRight 导致数组成为对象,我该如何修复逻辑?【英文标题】:JS reduceRight is causing arrays to become objects, how can I fix the logic? 【发布时间】:2021-12-14 00:31:52 【问题描述】:我有一个 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]
谢谢!
【问题讨论】:
与reduceRight
无关。您的 reducer 函数返回一个对象。使用普通的 reduce
会得到相同的结果。
您希望如何获得第 0 个索引处的值:80
?
是的,您现在的自定义逻辑是“返回单个对象”。
***.com/questions/47490773/… 相同的基本概念,除了不是字符串,你有一个数组。
是的,但我仍然有原件,所以我打算通过原来的“未更改”部分检索第 0 位
【参考方案1】:
这似乎工作,最后...我使用了一个常规的reduce()
并检查密钥是否是一个数组,如果它将我的原始数组存储到一个tmp
对象中并保存该密钥。下次出现reduce()
时,如果index
在最后一个路径元素上,则将tmp[tmp_key][key]
设置为我的目标值并返回为数组调整的对象。
我可以看到这对嵌套的 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);
【讨论】:
以上是关于JS reduceRight 导致数组成为对象,我该如何修复逻辑?的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript学习笔记:数组reduce()和reduceRight()方法