Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays_Ecmascript 6 - Fatal编程技术网

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}]