Javascript 展平,同时拆分为更小的对象
我有这种数组结构Javascript 展平,同时拆分为更小的对象,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我有这种数组结构 [{ "primary_product": "Blueberry", "list_of_products": ["Raspberry","Strawberry","Blackberry"]}] 我想对模式进行分解,使其如下所示 [{"id": 1,"value":"Blueberry"},{
[{ "primary_product": "Blueberry",
"list_of_products": ["Raspberry","Strawberry","Blackberry"]}]
我想对模式进行分解,使其如下所示
[{"id": 1,"value":"Blueberry"},{"id": 2,"value":"Raspberry"},{"id": 3,"value":"Strawberry"}, …]
主产品将是第一个产品,然后将字符串数组生成键/值对。如何使用es6实现这一点?您所需要的只是基本功能,如forEach和push。我建议你学习这些
let arr1 = [{ "primary_product": "Blueberry", "list_of_products": ["Raspberry","Strawberry","Blackberry"]}]
arr2 = [{ id: 1, value: arr1[0].primary_product }]
arr1[0].list_of_products.forEach((element) => {
arr2.push({ id: arr2.length + 1, value: element })
})
您所需要的只是基本功能,如forEach和push。我建议你学习这些
let arr1 = [{ "primary_product": "Blueberry", "list_of_products": ["Raspberry","Strawberry","Blackberry"]}]
arr2 = [{ id: 1, value: arr1[0].primary_product }]
arr1[0].list_of_products.forEach((element) => {
arr2.push({ id: arr2.length + 1, value: element })
})
这是一个使用
产品列表上的映射的单行程序:
const arr = ['Raspberry','Strawberry','Blackberry'];
return arr.map((val, i) => {return {id: i+1, value: val}});
结果是:
[
{ id: 1, value: 'Raspberry' },
{ id: 2, value: 'Strawberry' },
{ id: 3, value: 'Blackberry' }
]
请注意,map
的回调包括(currentValue,index,arr)
在产品列表上使用map
的一行代码:
const arr = ['Raspberry','Strawberry','Blackberry'];
return arr.map((val, i) => {return {id: i+1, value: val}});
结果是:
[
{ id: 1, value: 'Raspberry' },
{ id: 2, value: 'Strawberry' },
{ id: 3, value: 'Blackberry' }
]
请注意,map
的回调包括(currentValue、index、arr)
为了让眼睛更容易看,我简化了结构:
const p=[{a:100,b:[101102103]}
,{a:200,b:[201202203]};
您可以将所有数字展平到一个列表中,即[100、101、102、103、200、201、202、203]
:
p.flatMap(({a,b})=>[a,…b]);
为了更接近您的目标,让我们首先创建一个id
函数,该函数将返回下一个数字:
const id=(n=>()=>++n)(0);
id();//=>1.
id();//=>2.
id();//=>3.
// …
然后,让我们创建一个函数obj
,它接受一个x
,并将其包装到一个对象中:
constobj=>x=>({id:id(),value:x});
obj(100);//=>{id:1,值:100);
obj(200);//=>{id:2,值:200);
// …
然后你可以做:
p.flatMap(({a,b})=>[obj(a),…b.map(obj)];
//=>[{id:1,值:100}
//=>,{id:2,值:101}
//=>,{id:3,值:102}
//=>,{id:4,值:103}
//=>,{id:5,值:200}
//=>,{id:6,值:201}
//=>,{id:7,值:202}
//=>,{id:8,值:203}]
为了让眼睛更容易看,我简化了结构:
const p=[{a:100,b:[101102103]}
,{a:200,b:[201202203]};
您可以将所有数字展平到一个列表中,即[100、101、102、103、200、201、202、203]
:
p.flatMap(({a,b})=>[a,…b]);
为了更接近您的目标,让我们首先创建一个id
函数,该函数将返回下一个数字:
const id=(n=>()=>++n)(0);
id();//=>1
id();//=>2
id();//=>3
// …
然后,让我们创建一个函数obj
,它接受一个x
,并将其包装到一个对象中:
constobj=>x=>({id:id(),value:x});
obj(100);//=>{id:1,值:100);
obj(200);//=>{id:2,值:200);
// …
然后你可以做:
p.flatMap(({a,b})=>[obj(a),…b.map(obj)];
//=>[{id:1,值:100}
//=>,{id:2,值:101}
//=>,{id:3,值:102}
//=>,{id:4,值:103}
//=>,{id:5,值:200}
//=>,{id:6,值:201}
//=>,{id:7,值:202}
//=>,{id:8,值:203}]