Это массив, который у меня есть:
var arr1 = [
{ ModuleID : 'one', ModuleValue : 'valueX'},
{ ModuleID : 'one', ModuleValue : 'valueV'},
{ ModuleID : 'one', ModuleValue : 'valueE'},
{ ModuleID : 'one', ModuleValue : 'valueY'},
{ ModuleID : 'two', ModuleValue : 'valueZ'},
{ ModuleID : 'two', ModuleValue : 'valueB'},
{ ModuleID : 'two', ModuleValue : 'valueA'}
];
Я хотел бы добавить последовательный «индексный» номер в свой массив на основе ModuleID, например:
var arr2 = [
{ ModuleID : 'one', ModuleValue : 'valueX', index : 0},
{ ModuleID : 'one', ModuleValue : 'valueV', index : 1},
{ ModuleID : 'one', ModuleValue : 'valueE', index : 2},
{ ModuleID : 'one', ModuleValue : 'valueY', index : 3},
{ ModuleID : 'two', ModuleValue : 'valueZ', index : 0},
{ ModuleID : 'two', ModuleValue : 'valueB', index : 1},
{ ModuleID : 'two', ModuleValue : 'valueA', index : 2}
];
До сих пор я придумал этот код:
var arr2 = [];
var index = 0;
for (var i = 0; i < arr1.length; ++i) {
if (i < arr1.length && arr1[i].ModuleID = arr1[i+1].ModuleID ) {
index = index + 1;
} else {
index = 0;
};
arr2.push({ModuleID: arr1[i].ModuleID, ModuleValue: arr1[i].ModuleValue, index: index});
};
Однако он сбрасывает порядковый номер в последнем значении ModuleID вместо первого значения:
var arr2 = [
{ ModuleID : 'one', ModuleValue : 'valueX', index : 1},
{ ModuleID : 'one', ModuleValue : 'valueV', index : 2},
{ ModuleID : 'one', ModuleValue : 'valueE', index : 3},
{ ModuleID : 'one', ModuleValue : 'valueY', index : 0},
{ ModuleID : 'two', ModuleValue : 'valueZ', index : 1},
{ ModuleID : 'two', ModuleValue : 'valueB', index : 2},
{ ModuleID : 'two', ModuleValue : 'valueA', index : 3}
];
Как я могу улучшить свой код?
Вы можете взять хеш-таблицу для групповых индексов.
var array = [{ ModuleID: 'one', ModuleValue: 'valueX' }, { ModuleID: 'one', ModuleValue: 'valueV' }, { ModuleID: 'one', ModuleValue: 'valueE' }, { ModuleID: 'one', ModuleValue: 'valueY' }, { ModuleID: 'two', ModuleValue: 'valueZ' }, { ModuleID: 'two', ModuleValue: 'valueB' }, { ModuleID: 'two', ModuleValue: 'valueA' }],
result = array.map(
(c => o => ({ ...o, index: (c[o.ModuleID] ??= 0, c[o.ModuleID]++) }))
({})
);
console.info(result);
Просто прокрутите массив и проверьте значение ModuleID
и в зависимости от этого значения добавьте свойство index
со значением одного из двух возможных счетчиков, которые затем увеличиваются. Логику if/then можно было бы сделать более компактной, но я использовал здесь switch
на случай, если позже будут добавлены дополнительные значения ModuleID
, которые также необходимо проверить.
var arr1 = [
{ ModuleID : 'one', ModuleValue : 'valueX'},
{ ModuleID : 'one', ModuleValue : 'valueV'},
{ ModuleID : 'one', ModuleValue : 'valueE'},
{ ModuleID : 'one', ModuleValue : 'valueY'},
{ ModuleID : 'two', ModuleValue : 'valueZ'},
{ ModuleID : 'two', ModuleValue : 'valueB'},
{ ModuleID : 'two', ModuleValue : 'valueA'}
];
let a = 0;
let b = 0;
arr1.forEach(function(obj){
switch (obj.ModuleID) {
case "one":
obj.index = a++;
break;
case "two":
obj.index = b++;
break;
}
});
console.info(arr1);
var arr2 = [];
var index = 0;
var transition = false;
for (var i = 0; i < arr1.length; ++i) {
if (i < arr1.length && arr1[i].ModuleID = arr1[i+1].ModuleID ) {
index = index + 1;
} else {
transition = true;index = index + 1;
};
arr2.push({ModuleID: arr1[i].ModuleID, ModuleValue: arr1[i].ModuleValue, index: index});
if (transition){
index=0;
transition = false;
}
};
let idx = 0;
arr.map((item, i) => {
if (i == 0 || arr[i].ModuleID != arr[i-1].ModuleID)
idx = 0;
else
idx++;
item['index'] = idx;
});
Большое спасибо, это работает. Сейчас попробую разобраться ;)
это то, что вы хотите сделать?
var arr1 = [
{ModuleID: 'one', ModuleValue: 'valueX'},
{ModuleID: 'one', ModuleValue: 'valueV'},
{ModuleID: 'one', ModuleValue: 'valueE'},
{ModuleID: 'one', ModuleValue: 'valueY'},
{ModuleID: 'two', ModuleValue: 'valueZ'},
{ModuleID: 'two', ModuleValue: 'valueB'},
{ModuleID: 'two', ModuleValue: 'valueA'}
];
function setIndex (item, idx) {
arr1 [idx] .index = idx + 1
}
arr1.forEach (setIndex)
console.info ("code changed")
console.info (arr1)
Это сгенерированный результат
[
{
"ModuleID": "one",
"ModuleValue": "valueX",
"index": 1
},
{
"ModuleID": "one",
"ModuleValue": "valueV",
"index": 2
},
{
"ModuleID": "one",
"ModuleValue": "valueE",
"index": 3
},
{
"ModuleID": "one",
"ModuleValue": "valueY",
"index": 4
},
{
"ModuleID": "two",
"ModuleValue": "valueZ",
"index": 5
},
{
"ModuleID": "two",
"ModuleValue": "valueB",
"index": 6
},
{
"ModuleID": "two",
"ModuleValue": "valueA",
"index": 7
}
]
Нет, это не то, чего хочет ОП.
спасибо за ваше предложение, но на самом деле это не то, что я искал, поскольку эти индексы продолжаются.
Возможно ли иметь еще один объект
ModuleID:'one'
после'two'
? Или это всегда сортируется поModuleID
?