#arrays #json #angular #typescript #ecmascript-6
#массивы #json #angular #typescript #ecmascript-6
Вопрос:
При вызове службы я получаю аналогичные данные JSON, подобные следующим:
myArray: any = [
{item: 'Jelly Beans', areaCode: 321, Company: "Bob's Candy"},
{item: 'Skittles', areaCode: 444, Company: "Jim's Candy"},
{item: 'Snickers', areaCode: 321, Company: "Bob's Candy"},
{item: 'Mamp;Ms', areaCode: 444, Company: "Jim's Candy"},
{item: 'Gummy Bears', areaCode: 123, Company: "Sally's Candy"}];
Мне нужно динамически разделить это на несколько массивов объектов на основе areaCode.
Или создайте новый объект динамически на основе areaCode.
this.myArray= this.data.map(item => item.areaCode)
.filter((value, index, self) => self.indexOf(value) === index);
У меня есть мысли использовать функцию map и отфильтровать ее на основе areaCode, а затем, возможно, создать новый объект с массивами на основе areaCode. Кажется, я просто не могу разобраться в этом процессе. Если кто-нибудь может дать какой-нибудь совет, я был бы благодарен.
Комментарии:
1. Каков ожидаемый результат?
Ответ №1:
вы ожидаете что-то вроде этого в качестве выходных данных
{
"123":[{"item":"Gummy Bears","areaCode":123,"Company":"Sally's Candy"}],
"321":[{"item":"Jelly Beans","areaCode":321,"Company":"Bob's Candy"},
{"item":"Snickers","areaCode":321,"Company":"Bob's Candy"}],
"444":[{"item":"Skittles","areaCode":444,"Company":"Jim's Candy"},
{"item":"Mamp;Ms","areaCode":444,"Company":"Jim's Candy"}]
}
затем вы можете уменьшить, чтобы достичь этого
const output = myArray.reduce((res,v) => {
if(!res[v.areaCode]) {
res[v.areaCode] = [v]
} else {
res[v.areaCode].push(v)
}
return res
},{} )
Ответ №2:
Вместо этого вы можете использовать .reduce
для преобразования вашего массива в объект, а затем использовать Object.values()
для получения вашего массива уникальных объектов из объекта reduce вот так:
const arr = [
{item: 'Jelly Beans', areaCode: 321, Company: "Bob's Candy"},
{item: 'Skittles', areaCode: 444, Company: "Jim's Candy"},
{item: 'Snickers', areaCode: 321, Company: "Bob's Candy"},
{item: 'Mamp;Ms', areaCode: 444, Company: "Jim's Candy"},
{item: 'Gummy Bears', areaCode: 123, Company: "Sally's Candy"}];
const res = Object.values(arr.reduce((acc, {item, areaCode, Company}) => {
if(areaCode in acc) {
acc[areaCode].item.push(item);
} else {
acc[areaCode] = {item: [item], areaCode, Company};
};
return acc;
}, {}));
console.log(res);