我有一個看起來像這樣的模式物件:
const schema = {
social: {
facebook: 'someValue',
twitter: {
department: {
departmentImage: {
editable: 'someValue'
}
}
}
}
};
該editable屬性指示我要編輯的值,并且可能出現在物件的多個嵌套位置中。
我編輯它的方法是遞回地創建一個新物件,它是原始物件的精確副本,并在我遇到的地方填充一個新值editable。像這樣:
const formatSchema = (schema, data, formattedSchema = {}) => {
for (const schemaKey in schema) {
const firstKey = Object.keys(schema[schemaKey])[0];
if (schema[schemaKey] instanceof Object) {
formattedSchema[schemaKey] = schema[schemaKey];
formatschema(schema[schemaKey], data, formattedSchema[schemaKey]);
}
if (schema[schemaKey] instanceof Object && firstKey === 'editable') {
*replacing data logic*
formattedSchema[schemaKey] = ...*replacingData*;
formatschema(schema[schemaKey], data, formattedSchema[schemaKey]);
} else {
formattedSchema[schemaKey] = schema[schemaKey];
}
}
return formattedSchema;
};
但我覺得這個解決方案可能效率低下,因為我從頭開始創建物件的每一位,這每天會發生數千次。
有沒有辦法做得更好?
uj5u.com熱心網友回復:
update這是一個適用于任何本機輸入型別的遞回不可變物件。不要擔心這里的性能,因為它非常快,即使您的物件有數千個欄位。讓我知道這有多適合您,如果需要,我可以做出改變 -
function update(t, func) {
switch (t?.constructor) {
case Object:
return Object.fromEntries(
Object.entries(t).map(([k,v]) =>
[k, func([k, update(v, func)])]
)
)
case Array:
return t.map((v, k) => func([k, update(v, func)]))
default:
return func([null, t])
}
}
const schema = {
social: {
facebook: 'someValue',
twitter: {
department: {
departmentImage: {
editable: 'someValue'
}
},
someArr: [{ editable: 1 }, { editable: 2 }, { hello: "world" }]
},
}
}
console.log(update(schema, ([k,v]) =>
k == "editable" ? "?" : v
))
.as-console-wrapper {min-height: 100% !important; top: 0}
{
"social": {
"facebook": "someValue",
"twitter": {
"department": {
"departmentImage": {
"editable": "?"
}
},
"someArr": [
{
"editable": "?"
},
{
"editable": "?"
},
{
"hello": "world"
}
]
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/461008.html
標籤:javascript 递归 嵌套对象
