首页 > 解决方案 > 动态创建对象数组错误修复

问题描述

这是我拥有的对象数组:

    var sentences = [
    { id: "1-1", layer: ["A", "X", "Y"] },
    { id: "1-2", layer: ["B", "Z"] },
    { id: "1-3", layer: ["C", "P"] },
    { id: "2-1", layer: ["D"] },
    { id: "2-2", layer: ["E"] },
    { id: "2-3", layer: ["F"] },
    { id: "3-1", layer: ["G"] },
    { id: "3-2", layer: ["H"] },
    { id: "3-3", layer: ["I"] },
    ];

id 中的第一个数字是幻灯片编号,第二个数字是该幻灯片上的句子。例如 id: 3-2 是幻灯片 3 和句子 2。

所以我们这里有3张幻灯片......

现在的问题是如何以编程方式填充幻灯片数组,如下所示:

var slides = [
{ slide_id: "1", slide_layer: ["A", "X", "Y", "B", "Z", "C", "P"] },
{ slide_id: "2", slide_layer: ["D", "E", "F"] },
{ slide_id: "3", slide_layer: ["G", "H", "I"] },
]

感谢@Nenad Vracar,我有这段代码可以完美地做到这一点:

var sentences = [
{ id: "1-1", layer: ["A", "X", "Y"] },
{ id: "1-2", layer: ["B", "Z"] },
{ id: "1-3", layer: ["C", "P"] },
{ id: "2-1", layer: ["D"] },
{ id: "2-2", layer: ["E"] },
{ id: "2-3", layer: ["F"] },
{ id: "3-1", layer: ["G"] },
{ id: "3-2", layer: ["H"] },
{ id: "3-3", layer: ["I"] },
];

//

let result = Object.values(sentences.reduce((r, {id, layer}) => {
  let [a, b] = id.split('-');
  if(!r[a]) r[a] = { slide_id: a, slide_layer: [] }
  r[a].slide_layer[b - 1] = layer[0]
  return r;
}, {}))

console.log(result)

问题是它只添加了层数组的第一个元素而忽略了其余的。

我试过循环这条线但没有成功: r[a].slide_layer[b - 1] = layer[i]

我怎样才能解决这个问题?

标签: javascript

解决方案


layer[0]您可以使用扩展语法代替使用push整个layer数组:slide_layer

const sentences=[{id:"1-1",layer:["A","X","Y"]},{id:"1-2",layer:["B","Z"]},{id:"1-3",layer:["C","P"]},{id:"2-1",layer:["D"]},{id:"2-2",layer:["E"]},{id:"2-3",layer:["F"]},{id:"3-1",layer:["G"]},{id:"3-2",layer:["H"]},{id:"3-3",layer:["I"]},];

const result = Object.values(sentences.reduce((r, {id, layer}) => {
  let [a, b] = id.split('-');
  if(!r[a]) r[a] = { slide_id: a, slide_layer: [] }
  r[a].slide_layer.push(...layer)
  return r;
}, {}))

console.log(result)


推荐阅读