问题描述
希望使用ES6语法根据键(放置)值从现有阵列(产品)创建新阵列。产品可以很多
输入数组:
var products= [{
"sku": "A00001","price": 750,"isNew": false,"isPurchasable": true,"placement": "item_page_1"
},{
"sku": "A00002",{
"sku": "B04501","price": 212,"placement": "item_page_2"
},{
"sku": "A00451","price": 110,"isNew": true,"isPurchasable": false,{
"sku": "CA00013","price": 350,{
"sku": "A045322","price": 219,"placement": "item_page_3"
},{
"sku": "A045323","price": 33,{
"sku": "D048823","price": 426,{
"sku": "C055441","price": 1310,"placement": "item_page_4"
}];
期望输出:
{
"placements":
[
{
"placementName": "item_page_1","items": [
{
"sku": "A00001","placement": "item_page_1"
},{
"sku": "A00002",{
"sku": "CA00013",{
"sku": "D048823",]
},{
"placementName": "item_page_2","items":[
{
"sku": "B04501","placement": "item_page_2"
},{
"sku": "A00451","placement": "item_page_2"
}
]
},{
"placementName": "item_page_3","items":[
{
"sku": "A045322","placement": "item_page_3"
},{
"sku": "A045323","placement": "item_page_3"
}
]
},{
"placementName": "item_page_4","items":[
{
"sku": "C055441","placement": "item_page_4"
}
]
}
]
}
解决方法
您可以按placement
对产品进行分组,然后通过结合使用Object.entries
(doc)和map
来操纵结果
var products = [
{ sku: "A00001",price: 750,isNew: false,isPurchasable: true,placement: "item_page_1" },{ sku: "A00002",{ sku: "B04501",price: 212,placement: "item_page_2" },{ sku: "A00451",price: 110,isNew: true,isPurchasable: false,{ sku: "CA00013",price: 350,{ sku: "A045322",price: 219,placement: "item_page_3" },{ sku: "A045323",price: 33,{ sku: "D048823",price: 426,{ sku: "C055441",price: 1310,placement: "item_page_4" },]
const groups = products.reduce((acc,product) => {
if (acc[product.placement]) {
acc[product.placement].push(product)
} else {
acc[product.placement] = [product]
}
return acc
},{})
const res = {
placements: Object.entries(groups).map(([key,value]) => ({
placementName: key,items: value,})),}
console.log(res)
,
使用forEach遍历产品。如果索引数组中有一个条目属性放置,请查找每个对象。如果不是这样,请创建此条目,并将新的放置对象添加到结果数组中,该对象具有属性placement,并且对于项目为空数组。否则,只需将索引与结果中的相应位置放在一起即可。在两种情况下,都将对象添加到items-array。
function transfer(array) {
let result= {placements: []};
let placements = [];
array.forEach(obj => {
let index = placements.indexOf(obj.placement);
let placement;
if (index==-1) {
placement = {placementName: obj.placement,items: []};
result.placements.push(placement);
placements.push(obj.placement);
} else {
placement = result.placements[index];
}
placement.items.push(obj);
});
return result;
}
var products= [{
"sku": "A00001","price": 750,"isNew": false,"isPurchasable": true,"placement": "item_page_1"
},{
"sku": "A00002",{
"sku": "B04501","price": 212,"placement": "item_page_2"
},{
"sku": "A00451","price": 110,"isNew": true,"isPurchasable": false,{
"sku": "CA00013","price": 350,{
"sku": "A045322","price": 219,"placement": "item_page_3"
},{
"sku": "A045323","price": 33,{
"sku": "D048823","price": 426,{
"sku": "C055441","price": 1310,"placement": "item_page_4"
}];
console.log(transfer(products));
,
基于placement
为每个键构建一个具有聚合值的对象。然后获取Object.values
const convert = (arr) => {
const res = {};
arr.forEach(({ placement,...item }) => {
if (!res[placement]) {
res[placement] = { placementName: placement,items: [] };
}
res[placement].items.push({ placement,...item });
});
return Object.values(res);
};
var products = [
{
sku: "A00001",placement: "item_page_1",},{
sku: "A00002",{
sku: "B04501",placement: "item_page_2",{
sku: "A00451",{
sku: "CA00013",{
sku: "A045322",placement: "item_page_3",{
sku: "A045323",{
sku: "D048823",{
sku: "C055441",placement: "item_page_4",];
const output = { placements: convert(products) };
console.log(output);