如果鍵在 JavaScript 上是正確的,我正在嘗試映射物件值并添加文本。這是我們的物件:
{
"id": "n27",
"name": "Thomas More",
"className": "level-1",
"children": [
{
"id": "n1",
"name": "Rousseau",
"className": "level-2",
"children": [
{
"id": "n2",
"name": "Machiavelli",
"className": "level-3",
"children": [
{
"id": "n9",
"name": "Edison, Thomas",
"className": "level-4"
}
]
}
]
},
{
"id": "n3",
"name": "Einstein",
"className": "level-2",
"children": [
{
"id": "n10",
"name": "Arf, Cahit",
"className": "level-3",
"children": [
{
"id": "n15",
"name": "Rawls, John",
"className": "level-4"
}
]
},
{
"id": "n12",
"name": "Smith, Adam",
"className": "level-3",
"children": [
{
"id": "n11",
"name": "Kant, Immanuel",
"className": "level-4"
}
]
}
]
},
{
"id": "n60",
"name": "Turing, Alan",
"className": "level-2"
}
]
}
我想添加" YES"到他們className的。所以新物件應該是這樣的:
{
"id": "n27",
"name": "Thomas More",
"className": "level-1 YES",
"children": [
{
"id": "n1",
"name": "Rousseau",
"className": "level-2 YES",
"children": [
{
"id": "n2",
"name": "Machiavelli",
"className": "level-3 YES",
"children": [
{
"id": "n9",
"name": "Edison, Thomas",
"className": "level-4 YES"
}
]
}
]
},
{
"id": "n3",
"name": "Einstein",
"className": "level-2 YES",
"children": [
{
"id": "n10",
"name": "Arf, Cahit",
"className": "level-3 YES",
"children": [
{
"id": "n15",
"name": "Rawls, John",
"className": "level-4 YES"
}
]
},
{
"id": "n12",
"name": "Smith, Adam",
"className": "level-3 YES",
"children": [
{
"id": "n11",
"name": "Kant, Immanuel",
"className": "level-4 YES"
}
]
}
]
},
{
"id": "n60",
"name": "Turing, Alan",
"className": "level-2 YES"
}
]
}
我試過這個,但它增加了所有的鍵:
const addToClassName = (datasource, fn) => {
return Object.fromEntries(Object
.entries(datasource, fn)
.map(([k, v]) => [k, v && v.children != undefined && v.children.length > 0 ? addToClassName(v.children, fn) : fn(v)])
);
}
let res = addToClassName(obj, v => v ' YEP');
我該怎么做?
uj5u.com熱心網友回復:
您不需要使用Object.fromEntries(),而是讓您的函式回傳一個新物件,并className根據 的回傳值進行轉換fn。然后,您可以children:將物件上的鍵設定為 children 陣列內所有物件的映射版本。映射時,您可以將每個子項傳遞到對您的addToClassName()函式的遞回呼叫中。您可以children有條件地將鍵添加到輸出物件,但檢查它是否存在(使用children &&),然后使用擴展語法擴展結果...:
const data = { "id": "n27", "name": "Thomas More", "className": "level-1", "children": [ { "id": "n1", "name": "Rousseau", "className": "level-2", "children": [ { "id": "n2", "name": "Machiavelli", "className": "level-3", "children": [ { "id": "n9", "name": "Edison, Thomas", "className": "level-4" } ] } ] }, { "id": "n3", "name": "Einstein", "className": "level-2", "children": [ { "id": "n10", "name": "Arf, Cahit", "className": "level-3", "children": [ { "id": "n15", "name": "Rawls, John", "className": "level-4" } ] }, { "id": "n12", "name": "Smith, Adam", "className": "level-3", "children": [ { "id": "n11", "name": "Kant, Immanuel", "className": "level-4" } ] } ] }, { "id": "n60", "name": "Turing, Alan", "className": "level-2" } ] };
const addToClassName = (obj, fn) => ({
...obj,
className: fn(obj.className),
...(obj.children && {children: obj.children.map(child => addToClassName(child, fn))})
});
console.log(addToClassName(data, v => v " YES"));
uj5u.com熱心網友回復:
如果您可以更改當前obj物件,那么您可以使用遞回實作這一點
function addClass(obj) {
obj.className = " YES";
obj.children && obj.children.forEach(addClass);
}
const obj = {
id: "n27",
name: "Thomas More",
className: "level-1",
children: [
{
id: "n1",
name: "Rousseau",
className: "level-2",
children: [
{
id: "n2",
name: "Machiavelli",
className: "level-3",
children: [
{
id: "n9",
name: "Edison, Thomas",
className: "level-4",
},
],
},
],
},
{
id: "n3",
name: "Einstein",
className: "level-2",
children: [
{
id: "n10",
name: "Arf, Cahit",
className: "level-3",
children: [
{
id: "n15",
name: "Rawls, John",
className: "level-4",
},
],
},
{
id: "n12",
name: "Smith, Adam",
className: "level-3",
children: [
{
id: "n11",
name: "Kant, Immanuel",
className: "level-4",
},
],
},
],
},
{
id: "n60",
name: "Turing, Alan",
className: "level-2",
},
],
};
function addClass(obj) {
obj.className = " YES";
obj.children && obj.children.forEach(addClass);
}
addClass(obj);
console.log(obj);
uj5u.com熱心網友回復:
如果不介意,您可以使用lodash。
const _ = require('lodash');
const data = { "id": "n27", "name": "Thomas More", "className": "level-1", "children": [ { "id": "n1", "name": "Rousseau", "className": "level-2", "children": [ { "id": "n2", "name": "Machiavelli", "className": "level-3", "children": [ { "id": "n9", "name": "Edison, Thomas", "className": "level-4" } ] } ] }, { "id": "n3", "name": "Einstein", "className": "level-2", "children": [ { "id": "n10", "name": "Arf, Cahit", "className": "level-3", "children": [ { "id": "n15", "name": "Rawls, John", "className": "level-4" } ] }, { "id": "n12", "name": "Smith, Adam", "className": "level-3", "children": [ { "id": "n11", "name": "Kant, Immanuel", "className": "level-4" } ] } ] }, { "id": "n60", "name": "Turing, Alan", "className": "level-2" } ] };
const newData= _.cloneDeepWith(data, (val, key) => (
(key === 'className') ? `${val} YES` : _.noop()
));
console.log(newData);
// {
// id: 'n27',
// name: 'Thomas More',
// className: 'level-1 YES',
// ...
// }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/342672.html
標籤:javascript 数组 目的
上一篇:如何將陣列物件移動到第一個索引
