簡體   English   中英

將值添加到具有基於數組的鍵深度的對象

[英]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
      }
    }
  }
}

如何創建一個接受arrayvalue ,然后更新對象,以便使用新value更新數組中的key (數組中的最后一項)? 需要根據第一個array.length - 1數組中的array.length - 1字符串適當地嵌套它。

例如,我們將其稱為函數createObject 如果我使用上面已經定義為以下內容的arrayvalue來調用它:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM