【问题标题】:Update an deeply nested array of objects based on an object : Javascript基于对象更新深度嵌套的对象数组:Javascript
【发布时间】:2021-10-06 19:08:15
【问题描述】:

我有一个具有某些属性的对象的深度嵌套数组,并且给定一个对象作为输入,它应该递归地更新该对象及其子对象。它的格式如下,

const arr = [
  {
    name: "parent",
    children: [
      {
        name: "child1",
        children: [
          {
            name: "granchild1",
            children: [],
            class: "level-2 leaf",
            config: {
              name: "granchild1",
              value1: false,
              value2: false
            }
          }
        ],
        class: "level-1 leaf",
        config: {
          name: "child1",
          value1: false,
          value2: false
        }
      },
      {
        name: "child2",
        children: [],
        class: "level-1 leaf",
        config: {
          name: "child2",
          value1: false,
          value2: false
        }
      }
    ],
    class: "level-0 group",
    config: {
      name: "parent",
      value1: false,
      value2: false
    }
  }
];

给定的输入对象看起来像

const obj = {
  name: "parent",
  value1: true,
  value2: true
};

鉴于此输入,具有匹配名称的对象应该使用 obj's 值更新它和孩子的 value1value2

输出应该是这样的

const result = [
  {
    name: "parent",
    children: [
      {
        name: "child1",
        children: [
          {
            name: "granchild1",
            children: [],
            class: "level-2 leaf",
            config: {
              name: "granchild1",
              value1: true,
              value2: true
            }
          }
        ],
        class: "level-1 leaf",
        config: {
          name: "child1",
          value1: true,
          value2: true
        }
      },
      {
        name: "child2",
        children: [],
        class: "level-1 leaf",
        config: {
          name: "child2",
          value1: true,
          value2: true
        }
      }
    ],
    class: "level-0 group",
    config: {
      name: "parent",
      value1: true,
      value2: true
    }
  }
];

我尝试过的代码。如何实现相同的输出

const res = arr.map((item) => {
  let foundItem = arr.find((item) => item.name === obj.name);
  return {
    ...foundItem,
    children: {
      value1: obj.value1,
      value2: obj.value2
    }
  };
});

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    您需要一个递归函数来传递是否在其祖先之一中找到所需的父级。

    const arr=[{name:"parent",children:[{name:"child1",children:[{name:"granchild1",children:[],class:"level-2 leaf",config:{name:"granchild1",value1:!1,value2:!1}}],class:"level-1 leaf",config:{name:"child1",value1:!1,value2:!1}},{name:"child2",children:[],class:"level-1 leaf",config:{name:"child2",value1:!1,value2:!1}}],class:"level-0 group",config:{name:"parent",value1:!1,value2:!1}}];
    
    const recurse = (arr, nameToFind, objToMerge, inAncestor = false) => {
      return arr.map(obj => {
        const mergeThis = inAncestor || obj.name === nameToFind;
        const merged = !mergeThis ? obj : { ...obj, config: { ...obj.config, ...objToMerge } };
        if (merged.children) {
          merged.children = recurse(merged.children, nameToFind, objToMerge, mergeThis);
        }
        return merged;
      });
    };
    const obj = {
      name: "parent",
      value1: true,
      value2: true
    };
    const { name, ...objToMerge } = obj;
    const result = recurse(arr, name, objToMerge);
    console.log(result);

    【讨论】:

    • 谢谢你,很有魅力
    猜你喜欢
    • 2017-06-29
    • 2022-06-16
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2021-06-25
    • 2018-06-04
    相关资源
    最近更新 更多