Переформатировать массив объектов в массив массивов ключей
Так что я новичок в Javascript, но я пытаюсь переформатировать startArray в endArray. StartArray - это массив объектов порядка, которые всегда будут иметь разные порядковые номера, но могут иметь один и тот же идентификатор компании. Я в основном пытаюсь переключить его так, чтобы он основывался на компании, и чтобы для каждого идентификатора компании существовал массив всех заказов этих компаний. Я возился и пытался понять это, но, честно говоря, я не уверен, с чего начать, и возможна ли эта манипуляция.
Я работаю над сценариями Google Apps, которые, я думаю, все еще используют синтаксис ES5, и я предпочел бы придерживаться ванильного JavaScript, если это вообще возможно.
var startArray = [
{"companyId" : 1,
"orderId" : 25,
"product" : "productA"
"quantity" : 2,
"price" : 10,
},
{"companyId" : 1,
"orderId" : 20,
"product" : "productB"
"quantity" : 3,
"price" : 5,
},
{"companyId" : 2,
"orderId" : 15,
"product" : "productA"
"quantity" : 5,
"price" : 10,
}
]
var endArray = [ {
'1' = [{"orderId" : 25,
"product" : "productA"
"quantity" : 2,
"price" : 10,},
{"orderId" : 20,
"product" : "productB"
"quantity" : 3,
"price" : 5,}
},{
'2' = [{"orderId" : 15,
"product" : "productA"
"quantity" : 5,
"price" : 10,
}]
}]
]
2 ответа
Используйте что-то вроде reduce
создать новый объект, вставив массив в качестве ключа companyId
если он еще не существует:
function reduce(arr, callback, initialVal) {
var accumulator = (initialVal === undefined) ? undefined : initialVal;
for (var i = 0; i < arr.length; i++) {
if (accumulator !== undefined)
accumulator = callback.call(undefined, accumulator, arr[i], i, this);
else
accumulator = arr[i];
}
return accumulator;
}
var startArray = [
{"companyId" : 1,
"orderId" : 25,
"product" : "productA",
"quantity" : 2,
"price" : 10,
},
{"companyId" : 1,
"orderId" : 20,
"product" : "productB",
"quantity" : 3,
"price" : 5,
},
{"companyId" : 2,
"orderId" : 15,
"product" : "productA",
"quantity" : 5,
"price" : 10,
}
];
var endObj = reduce(startArray, function (accum, item) {
var companyId = item.companyId;
if (!accum[companyId]) accum[companyId] = [];
delete item.companyId;
accum[companyId].push(item);
return accum;
}, {});
console.log(endObj);
Если вы согласны с результатом, являющимся объектом, а не массивом, это должно сделать работу:
var startArray = [
{"companyId" : 1,
"orderId" : 25,
"product" : "productA",
"quantity" : 2,
"price" : 10,
},
{"companyId" : 1,
"orderId" : 20,
"product" : "productB",
"quantity" : 3,
"price" : 5,
},
{"companyId" : 2,
"orderId" : 15,
"product" : "productA",
"quantity" : 5,
"price" : 10,
}
];
var ret = {}
startArray.forEach(company => {
if (!ret[company.companyId]) {
ret[company.companyId] = [];
}
ret[company.companyId].push(company);
});
console.log(ret);
Если у вас нет поддержки ES6, просто используйте классический for in
цикл вместо forEach
,