通过读取具有递归值的其他对象来创建新对象

问题描述 投票:0回答:1

我有一个对象

obj1
,它具有映射信息,该信息以值
vals
的形式存在于其他对象中。我能够创建平面对象结构,但递归不起作用,因此需要帮助

const obj1 = [
  {
    mapping: "cities",
  },
  {
    mapping: "category",
    children: {
      mapping: "type",
      children: {
        mapping: "otherType",
      },
    },
  },
  {
    mapping: "age",
  },
];

const vals = [
  {
    mapping: "category",
    values: [{}],
  },
  {
    mapping: "type",
    values: [{}],
  },
  {
    mapping: "otherType",
    values: [{}],
  },
  {
    mapping: "cities",
    values: [{}],
  },
  {
    mapping: "age",
    values: [{}],
  },
];


我想要以下来源的预期数据


const exectedData = {
    cities: {
        values: [{}],
    },
    category: {
        values: [{}],
        children: {
            type: {
                values: [{}],
                children: {
                    otherType: {
                        values: [{}],
                    }
                }
            }
        }
    },
    age: {
        values: [{}]
    }
}

通过下面的方法,我可以创建平面数据,但递归数据不属于

children
属性



  const processItem = (config, vals) => {
    const isDataAvailable = vals.find(
      (item) => item.category === config.category,
    );

    if (isDataAvailable) {
      if (config.children) {
        processItem(config.children, vals);
      }

      const { mapping } = config;
      finalData.push({
        mapping,
        values: isDataAvailable.values,
      });
    }
  };

  config.forEach((config) => processItem(config, values));
javascript recursion
1个回答
0
投票

您可以将值转换为对象,以便更快地更新值查找并进行简单的递归:

const obj = [
  {
    mapping: "cities",
  },
  {
    mapping: "category",
    children: {
      mapping: "type",
      children: {
        mapping: "otherType",
      },
    },
  },
  {
    mapping: "age",
  },
];

const vals = [
  {
    mapping: "category",
    values: [{}],
  },
  {
    mapping: "type",
    values: [{}],
  },
  {
    mapping: "otherType",
    values: [{}],
  },
  {
    mapping: "cities",
    values: [{}],
  },
  {
    mapping: "age",
    values: [{}],
  },
];

const map = vals.reduce((r, {mapping, ...item}) => (r[mapping] = item, r), {});

const update = obj => {
  if(Array.isArray(obj)) return obj.forEach(update);
  if(typeof obj !== 'object') return;
  Object.values(obj).forEach(update);
  Object.assign(obj, map[obj.mapping]);
};

update(obj);
console.log(obj);

© www.soinside.com 2019 - 2024. All rights reserved.