如何 return 对象 Object.keys Javascript

How to return Objects with Object.keys Javascript

我如何 return 在 Javascript 中使用 Object.keys 对象,React?我想将我的状态设置成这样:

dataset = [
{id:1,text_1:root,father:null,color:"#FF5722"},
{id:2,text_1:child1,father:1,color:"#FFC107"},
{id:3,text_1:child2,father:1,color:"#FFC107"},
{id:4,text_1:child3,father:1,color:"#FFC107"},
{id:5,text_1:child11,father:2,color:"#8BC34A"},
{id:6,text_1:child12,father:2,color:"#8BC34A"},
{id:7,text_1:child13,father:2,color:"#8BC34A"}
]

来自这个对象:

{
"root":{
   "child1":{
      "child11":[
         "data"
      ],
      "child12":[
         "data",
         "data",
         "data"
      ],
      "child13":[
         "data"
      ],
      "child14":[
         "data",
      ]
   },
   "child2":{
      "child21":[
         "data"
      ],
      "child22":[
         "data",
         "data",
         "data"
      ],
      "child23":[
         "data"
      ],
      "child24":[
         "data"
      ]
   },
   "child3":{
      "child31":[
         "data"
      ],
      "child32":[
         "data"
      ],
      "child33":[
         "data"
      ],
      "child34":[
         "data",
      ]
   },
   "child4":{
      "child41":[
         "data"
      ],
      "child42":[
         "data",
         "data",
         "data"
      ],
      "child43":[
         "data"
      ],
   },
},
"root1":{
    ...
}
}

我试过了:

setTree([
            {
              id: 1,
              text_1: props.pickedRoot,
              father: null,
              color: "#FF5722",
            },
            Object.keys(res.data.treeData[0][props.pickedRoot]).map(
              (item, i) => ({
                id: i + 2,
                text_1: item,
                father: 1,
                color: "#FFC107",
              })
            ),
          ]);

它几乎可以工作,除了 Object.keys return 是一个数组,因此它给了我一个对象和一个对象数组。也许问题是我单独设置了我的根对象,但我真的不知道我怎么能只用一个 map() 函数来设置它。

我的解决方案得到的结果:

0: {id: 1, text_1: "root", father: null, color: "#FF5722"}
1: (7) [{…}, {…}, {…}, {…}, {…}, {…}, {…}]

我希望我能清楚地解释我的问题。

map 函数 returns 一个数组,这就是为什么你最终在你的数组中有另一个数组。我建议您将 map 返回的数组与 spread operator(...):

展开
setTree([
            {
              id: 1,
              text_1: props.pickedRoot,
              father: null,
              color: "#FF5722",
            },
            ...Object.keys(res.data.treeData[0][props.pickedRoot]).map(
              (item, i) => ({
                id: i + 2,
                text_1: item,
                father: 1,
                color: "#FFC107",
              })
            ),
          ]);

这样,除了您的第一个对象

之外,您基本上将所有新映射的对象都散布到 tree 数组中

评论回复

回复您的评论,您可以使用flatMap if your version supports it, or use an implemented flatMap function from a 3rd party library like lodash

所以我刚刚创建了这个函数来将您的对象转换为数组:

const objToArray = (father, root, globalIndex) => {
const keys = Object.keys(root);

  return keys.reduce((acc, curr) => {
    globalIndex++;
    const id = globalIndex;
    acc.push({
      id,
      text: curr,
      father,
    });
    console.log(globalIndex, acc);
    const children = root[curr];
    if (children.length === undefined) {
      acc.push(...objToArray(id, root[curr], globalIndex));
    }
    globalIndex = acc[acc.length - 1].id;
    return acc;
  }, []);
};

这个returns个n根元素,可以处理一个n层的对象。