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 导致数组成为对象,我该如何修复逻辑?的主要内容,如果未能解决你的问题,请参考以下文章

JS数组对象循环遍历方法

JS数组对象循环遍历方法

JS数组对象循环遍历方法

JavaScript学习笔记:数组reduce()和reduceRight()方法

js 判断数组里面的对象是不是有id相同(某一项),相同就过滤只留下一项

JavaScript归并方法reduce()和reduceRight()