我有一个深层嵌套的数据结构,我有兴趣匹配数组(和数组数组)中的某个值,然后将一些数据推送到随附的数组中。例如以下是我的数组colors并伴随着的是更多颜色数组可能存在也可能不存在:
var myData = [{
"color": "green",
"moreColors": [
{
"color": "beige"
},
{
"color": "black",
"moreColor": [
{
"color": "grey"
},
{
"color": "white",
"moreColors": [...]
}
]
}
]
}]
我有兴趣在数组中搜索颜色值grey并向该对象添加 moreColors 数组moreColors: [{"color" : "blue"}]
。在某些情况下,这可能会使用push()方法(如果数组已经存在)。我怎样才能最好地实现这一目标?我的目标是添加值并更新/变异myData这里是数组,因为这将被传递给另一个函数。这里的嵌套可能有几层深度,因此循环内的简单循环将不起作用。递归函数在这里效果最好吗?我也愿意接受更好的方法或使用类似的库下划线 or lodash。虽然我更喜欢普通的 js 版本。下面是我开始的一个递归解决方案,但是,代码的运行深度不会超过一个级别。
findNested(myData, "grey")
function findNested(myArray, color) {
myArray.moreColors?.forEach(element => {
if(element.color !== color){
if(element.moreColors.length > 0) {
findNested(element.moreColors, color);
}
} else {
element.moreColors.push({
"color": "blue"
});
}
});
}
这是我认为您正在尝试的一个简单示例。
findNestedColorObject()
接受一个数组和一个要搜索的颜色字符串,并返回第一个对象color
属性匹配。
updateMoreColors()
接受上面返回的对象并首先分配moreColors
如果不存在,则推送到数组。
function findNestedColorObject(array, color) {
let colorObject;
for (const obj of array) {
if (obj.color === color) {
colorObject = obj;
} else if (obj.moreColors !== undefined) {
colorObject = findNestedColorObject(obj.moreColors, color);
}
if (colorObject !== undefined) {
break;
}
}
return colorObject;
}
function updateMoreColors(colorObject, colors) {
colorObject.moreColors ??= [];
for (const color of [].concat(colors)) {
colorObject.moreColors.push({ color });
}
}
const myData = [{ "color": "green", "moreColors": [{ "color": "beige" }, { "color": "black", "moreColors": [{ "color": "grey" }, { "color": "white", "moreColors": ["ochre"] }] }] }];
const greyObject = findNestedColorObject(myData, 'grey');
console.log('found:')
console.log(greyObject);
updateMoreColors(greyObject, 'purple');
console.log('updated:');
console.log(greyObject);
const beigeObject = findNestedColorObject(myData, 'beige');
console.log('found:')
console.log(beigeObject);
updateMoreColors(beigeObject, ['salmon', 'crimson']);
console.log('updated:');
console.log(beigeObject);
// edit per the commments
const data = [{ color: "beige", moreColors: [{ color: "blue" }] }, { color: "black", moreColors: [{ color: "white" }] }];
const blue = findNestedColorObject(data, 'blue');
console.log('fixed overwrite error:')
console.log(blue);
或者,由于您尝试似乎在同一函数中搜索和更新,因此您可以组合上面的两个函数。 (这将继续更新所有匹配的对象,而不仅仅是第一个)。
function updateNestedColorObject(array, color, moreColors) {
for (const obj of array) {
if (obj.color === color) {
obj.moreColors ??= [];
for (const color of [].concat(moreColors)) {
obj.moreColors.push({ color });
}
}
if (obj.moreColors !== undefined) {
updateNestedColorObject(obj.moreColors, color, moreColors);
}
}
}
const myData = [{ "color": "green", "moreColors": [{ "color": "beige" }, { "color": "black", "moreColors": [{ "color": "grey" }, { "color": "white", "moreColors": ["ochre"] }] }] }];
updateNestedColorObject(myData, 'grey', 'purple');
updateNestedColorObject(myData, 'purple', 'beige');
updateNestedColorObject(myData, 'beige', ['salmon', 'crimson']);
console.log(myData);
Edit
正如评论中指出的,我的第一个findNestedColorObject
没有像成功搜索时那样退出循环。尽管可能有更干净的解决方案,但仍应用了快速修复。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)