[英]Add a value to an object with its key depth based on an array
我有一個數組。 可以說是:
const array = ["lvl1", "lvl2", "lvl3", "key"]
我有一個價值。 可以說是:
const value = false
我有一個對象。 可以說是:
const object = {
lvl1: {
dogs: "bark",
lvl2: {
cats: "meow",
lvl3: {
cows: "moo"
key: true
}
}
}
}
如何創建一個接受array
和value
,然后更新對象,以便使用新value
更新數組中的key
(數組中的最后一項)? 需要根據第一個array.length - 1
數組中的array.length - 1
字符串適當地嵌套它。
例如,我們將其稱為函數createObject
。 如果我使用上面已經定義為以下內容的array
和value
來調用它:
const newObject = createObject(array, value)
那么newObject應該等於:
{
lvl1: {
dogs: "bark",
lvl2: {
cats: "meow",
lvl3: {
cows: "moo"
key: false
}
}
}
}
這是另一個具有不同嵌套級別的示例:
const updatedObject = createObject(["lvl1", "lvl2", "cats"], "stink")
然后,updatedObject應該等於:
{
lvl1: {
dogs: "bark",
lvl2: {
cats: "stink",
lvl3: {
cows: "moo"
key: true
}
}
}
}
我已經走了這么遠,但沒有用:
import object from "./object"
const createObject = (array, value) => {
let results = object;
for (let i = 0; i < array.length; i++) {
i === array.length - 1
? (results = results[array[i]] = {
...results[array[i]],
[array[i]]: value
})
: (results = results[array[i]] = {
...results[array[i]],
[results[array[i]]]: {}
});
}
return results;
}
我不想更改初始對象。 我想返回一個新對象。 而且我不會在對象上添加任何新的鍵/值對,而只會更改現有的鍵/值對。
這有點通用,因為它不假定源是名為object
的全局變量:
let array = ["lvl1", "lvl2", "lvl3", "key"]; let value = false; let createObject = (keys, value) => { let o, obj = o = {}; let lastKey = keys.pop(); keys.forEach(key => o = o[key] = o[key] || {}); o[lastKey] = value; return obj; }; let addToObject = (obj, keys, value) => { let o, copy = o = JSON.parse(JSON.stringify(obj)); let lastKey = keys.pop(); keys.forEach(key => o = o[key] = o[key] || {}); o[lastKey] = value; return copy; }; let x = createObject(array, value); let y = addToObject(x, ['lvl1'], 3); let z = addToObject(y, ['a', 'b', 'c'], 4); console.log(x); console.log(y); console.log(z);
您可以獲取條目並構建新對象,並檢查實際鍵是否等於數組的第一項,然后還檢查其余數組的長度並獲取值。 對於嵌套副本,請檢查對象,然后通過再次調用該函數來構建新的更深層次。
function getObject(object, [key, ...keys], value) { return Object.assign({}, ...Object .entries(object) .map(([k, v ]) => ({ [k]: k === key && !keys.length ? value : v && typeof v === 'object' ? getObject(v, k === key ? keys : [], value) : v })), Object.keys(object).includes(key) || { [key]: keys.length ? getObject({}, keys, value) : value } ); } const object1 = { lvl1: { dogs: "bark", lvl2: { cats: "meow", lvl3: { cows: "moo", key: true } } } }, object2 = getObject(object1, ["lvl1", "lvl2", "lvl3", "key"], false), object3 = getObject(object2, ["lvl1", "lvl2", "cats"], "stink"), object4 = getObject({}, ["lvl1", "lvl2", "cats"], "stink");; console.log(object1); console.log(object2); console.log(object3); console.log(object4);
.as-console-wrapper { max-height: 100% !important; top: 0; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.