如何将对象的极深层属性映射到一个新对象中,并添加一些附加属性?

3

如何将以下对象的路径映射到新对象中,并添加访问深度嵌套属性的路径以及其他属性。

    const obj = {
      key1: { level1: { level2: { prop1: {}, prop5: {} } } },
      key2: { level1: { level2: { prop2: {} } } },
      key3: { level1: { prop3: {}, prop6: {}, prop7: {} } },
      key4: { level1: { level2: { level3: { prop4: {} } } } },
    };

转化为:

    const expectedObj = {
      key1Level1Level2Prop1: { path: "key1.level1.level2.prop1", name: "Prop 1", id: (Math.random() * 1000000).toFixed(0) },
      key2Level1Level2Prop2: { path: "key2.level1.level2.prop2", name: "Prop 2", id: (Math.random() * 1000000).toFixed(0) },
      key3Level1Prop3: { path: "key3.level1.prop3", name: "Prop 3", id: (Math.random() * 1000000).toFixed(0) },
      key4Level1Level2Level3Prop4: { path: "key4.level1.level2.level3.prop4", name: "Prop 4", id: (Math.random() * 1000000).toFixed(0) },
      key1Level1Level2Prop5: { path: "key1.level1.level2.prop5", name: "Prop 5", id: (Math.random() * 1000000).toFixed(0) },
      key3Level1Prop6: { path: "key3.level1.prop6", name: "Prop 6", id: (Math.random() * 1000000).toFixed(0) },
      key3:evel1Prop7: { path: "key3.level1.prop7", name: "Prop 7", id: (Math.random() * 1000000).toFixed(0) },
    };
请注意,此处映射了所有极端端点的道具 例如,prop1位于key1的极深层级中,因此在expectedObj中将其映射为prop1:{path:...}
因此,所有极深的道具(即空对象)都应该映射到期望结果中。 请注意,每个级别的极端端点上的所有道具都是空对象 {}
1个回答

1
您可以使用递归:

const obj = {
  key1: { level1: { level2: { prop1: {}, prop5: {} } } },
  key2: { level1: { level2: { prop2: {} } } },
  key3: { level1: { prop3: {}, prop6: {}, prop7: {} } },
  key4: { level1: { level2: { level3: { prop4: {} } } } },
};

function findExtremeNodes(obj) {
  return Object.entries(obj).reduce((res, [k, v]) => {
    if(!Object.keys(v).length) { // Extreme node
      res[k] = { path: k, name: capitalizedAndSpaced(k), id: getRandomId() };
    } else { // Subtree
      Object.entries(findExtremeNodes(v)).forEach(([k2, v2]) => {
        res[k + capitalize(k2)] = { ...v2, path: k + '.' + v2.path };
      });
    }
    return res;
  }, {});
}

function capitalizedAndSpaced(str) {
  return str.match(/[a-z]+|[^a-z]+/gi).map(capitalize).join(' ');
}

function capitalize(str) {
  return str[0].toUpperCase() + str.slice(1);
}

function getRandomId() {
  return (Math.random() * 1000000).toFixed(0);
}

const res = findExtremeNodes(obj);
document.body.innerHTML = '<pre>' + JSON.stringify(res, 0, 4) + '</pre>';


你能否也回答一下这个问题:https://stackoverflow.com/questions/62362111/how-to-transfer-props-of-an-object-from-one-location-to-another/62362652?noredirect=1#comment110295195_62362652 - reacg garav
好的,我已经发布了一个答案。 - blex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接