Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 以编程方式基于另一个对象数组创建对象数组_Javascript - Fatal编程技术网

Javascript 以编程方式基于另一个对象数组创建对象数组

Javascript 以编程方式基于另一个对象数组创建对象数组,javascript,Javascript,以下是我拥有的对象数组: var sentences = [ { id: "1-1", layer: ["A"] }, { id: "1-2", layer: ["B"] }, { id: "1-3", layer: ["C"] }, { id: "2-1", layer: ["D"] }, { id: "2-2", layer: ["E"] }, { id: "2-3", layer: ["F"] }, { id: "3-1", layer: ["G"] }, { id: "3-2", lay

以下是我拥有的对象数组:

var sentences = [
{ id: "1-1", layer: ["A"] },
{ id: "1-2", layer: ["B"] },
{ id: "1-3", layer: ["C"] },
{ 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", "B", "C"] },
{ slide_id: "2", slide_layer: ["D", "E", "F"] },
{ slide_id: "3", slide_layer: ["G", "H", "I"] },
]

我仍在研究,但我找不到合适的方法…

您可以使用
reduce
方法按id将幻灯片分组,使用对象作为累加器,然后您可以使用
对象.values
方法从该对象获取值数组

var语句=[{“id”:“1-1”,“layer”:[“A”]},{“id”:“1-2”,“layer”:[“B”]},{“id”:“1-3”,“layer”:[“C”]},{“id”:“2-1”,“layer”:[“D”]},{“id”:“2-2”,“layer”:[“E”]},{“id”:“2-3”,“layer”:[“id”:“3-1”,“layer”:“{“G”},{“id”:“3-2”,“layer”},{“id”},{“3”]
const result=Object.values(句子.reduce((r,{id,layer})=>{
设[a,b]=id.split('-');
如果(!r[a])r[a]={slide\u id:a,slide\u layer:[]}
r[a]。滑动层[b-1]=层[0]
返回r;
}, {}))

console.log(result)
这是一个代码易于阅读的解决方案

let slides = [];
for(let data of sentences) {
    let slideId = parseInt(data.id.split("-")[0]);
    let slideIndex = slideId-1;
    if (!slides[slideIndex]) slides[slideIndex] = {"slide_id": slideId, "slide_layer": []}
    slides[slideIndex].slide_layer.push(data.layer[0]);
}
console.log("slides", slides);

我们可以使用
Array.prototype.reduce
来积累
句子
数组中的幻灯片。我们需要使用
array.prototype.findIndex()
slide\u id
测试幻灯片对象是否已经存在于累加器数组中

如果存在(
idx
=0
),我们需要将
层添加到幻灯片对象的
幻灯片\u层
数组属性中

var语句=[
{id:“1-1”,层:[“A”]},
{id:“1-2”,层:[“B”]},
{id:“1-3”,层:[“C”]},
{id:“2-1”,层:[“D”]},
{id:“2-2”,层:[“E”]},
{id:“2-3”,层:[“F”]},
{id:“3-1”,层:[“G”]},
{id:“3-2”,层:[“H”]},
{id:“3-3”,层:[“I”]},
];
变量幻灯片=句子。减少((acc,ele)=>{
设idx=acc.findIndex(obj=>obj.slide_id==ele.id.split(“-”[0]);
如果(idx>=0){
设obj=acc[idx];
对象滑动层推送(元素层[0]);
}否则{
acc.push({slide_id:ele.id.split(“-”[0],slide_层:[ele.layer[0]]);
}
返回acc;
}, []);
控制台日志(幻灯片)JavaScript中的array reduce()方法用于将数组缩减为单个值,并为数组的每个值(从左到右)执行提供的函数,函数的返回值存储在累加器中

const output = Object.values(sentences.reduce((k, {id, layer}) => {
  let [frst, sec] = id.split('-');
  if(!k[frst]) 
  k[frst] = { slide_id: frst, slide_layer: [] }
  k[frst].slide_layer[sec - 1] = layer[0]
  return k;
}, {}))

请添加您尝试过的代码。