Как динамически разделить массив на основе одного значения в JavaScript Node.js
Мне нужно разделить массив динамически на основе одного значения в JavaScript.
У меня есть массив:
var dataStuff = [
{ Name: 'Apple', Tag: 'Fruit', Price: '2,5'},
{ Name: 'Bike', Tag: 'Sport', Price: '150'},
{ Name: 'Kiwi', Tag: 'Fruit', Price: '1,5'},
{ Name: 'Knife', Tag: 'Kitchen', Price: '8'},
{ Name: 'Fork', Tag: 'Kitchen', Price: '7'}
];
И я ожидаю, что массивы разделены по тегам, например.
var Fruit = [
{ Name: 'Apple', Tag: 'Fruit', Price: '2,5'},
{ Name: 'Kiwi', Tag: 'Fruit', Price: '1,5'}
];
var Sport = [
{ Name: 'Bike', Tag: 'Sport', Price: '150'}
];
var Kitchen = [
{ Name: 'Knife', Tag: 'Kitchen', Price: '8'},
{ Name: 'Fork', Tag: 'Kitchen', Price: '7'}
];
Если в массиве dataStuff будет больше тегов, то в результате будет больше массивов. В любом случае, я понятия не имею, как мне это сделать. Я использую node.js + Jade (для просмотра), и я думаю, что лучшая идея будет делать это при просмотре, потому что я должен поместить каждый массив в таблицу. Может быть, что-то вроде этого:
// Basic table
tbody
- each item in dataStuff
tr
td= item.Name
td= item.Tag
td= item.Price
// Other tables
- each item in dataStuff
item.Tag.push(item);
// adding items to array based on Tag
// probably it won't work
// but still how should i draw table?
Буду благодарен за любую помощь
2 ответа
Вы можете использовать объект с сгруппированными элементами. Он работает для любых тегов и позволяет получить список всех тегов с Object.keys(grouped)
, если необходимо.
var dataStuff = [{ Name: 'Apple', Tag: 'Fruit', Price: '2,5' }, { Name: 'Bike', Tag: 'Sport', Price: '150' }, { Name: 'Kiwi', Tag: 'Fruit', Price: '1,5' }, { Name: 'Knife', Tag: 'Kitchen', Price: '8' }, { Name: 'Fork', Tag: 'Kitchen', Price: '7' }],
grouped = Object.create(null);
dataStuff.forEach(function (a) {
grouped[a.Tag] = grouped[a.Tag] || [];
grouped[a.Tag].push(a);
});
document.write(Object.keys(grouped));
document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');
Если ваши имена тегов известны заранее и ограничены
тогда просто
var Fruit = dataStuff.filter(function(val){
return val.Tag == "Fruit";
});
var Sport = dataStuff.filter(function(val){
return val.Tag == "Sport";
});
var Kitchen = dataStuff.filter(function(val){
return val.Tag == "Kitchen";
});
Или вы можете создать объект JSON, сохраняя имена тегов как
var tags = {
"Fruit" : [],
"Sport" : [],
"Kitchen" : [],
};
for(var tag in tags)
{
tags[tag] = dataStuff.filter(function(val){
return val.Tag == tag;
});
}
Сейчас tags.Fruit
даст вам Fruit
массив.