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;
}, {}))
请添加您尝试过的代码。