数组到嵌套数组的转换

时间:2019-07-22 17:15:33

标签: javascript angular typescript

我的后端服务将数组的节点列表发送给我。但我需要的是,每个下一个节点都是其上一个节点的值(请参见示例)。我希望整个列表作为singe对象中的嵌套对象。

我所拥有的:

[
        {
            "nodeId": 1,

        },
        {
            "nodeId": 3,

        },
        {
            "nodeId": 16,

        }
    ]

我需要什么:

[
{
  "nodeId": 1,

  "staticChild": [
    {
      "nodeId": 3,

      "staticChild": [
        {
          "nodeId": 16,

        }
      ]
    }
  ]
}
]

4 个答案:

答案 0 :(得分:3)

您可以从右侧缩小数组,并使用staticChild属性构建一个新对象。

var array = [{ nodeId: 1 }, { nodeId: 3 }, { nodeId: 16 }],
    result = array.reduceRight((a, b) => ({ ...b, staticChild: [a] }));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

根据您提供的输入/输出,可以使用递归函数,如:

const data = [{
    nodeId: 1
  },
  {
    nodeId: 3
  },
  {
    nodeId: 16
  }
];

const transform = data => {
  const [node, ...rest] = data;
  if (rest.length > 0) {
    return {
      ...node,
      staticChild: [transform(rest)]
    };
  } else {
    return {
      ...node,
      hasChildren: false
    };
  }
};

const result = transform(data);
console.log(result);

答案 2 :(得分:1)

首先反转数组,然后使用reduce()在受尊敬的数组上进行迭代,以生成所需的格式。

t

答案 3 :(得分:1)

您可以使用reduceRight()数组方法执行转换。

const data = [{
    "nodeId": 1,

  },
  {
    "nodeId": 3,

  },
  {
    "nodeId": 16,

  }
]

const nested = data.reduceRight((acc, item) => {
  return [ { ...item, staticChild: acc } ]
}, []);

console.log(nested);

或更简洁地说:

const nested = data.reduceRight((acc, item) => [ { ...item, staticChild: acc } ],[]);