Как добавить последовательные порядковые номера к уникальным значениям в массиве

Это массив, который у меня есть:

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}
];

Как я могу улучшить свой код?

Возможно ли иметь еще один объект ModuleID:'one' после 'two'? Или это всегда сортируется по ModuleID?

adiga 23.12.2020 15:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
58
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете взять хеш-таблицу для групповых индексов.

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; 
});

Большое спасибо, это работает. Сейчас попробую разобраться ;)

Ant 23.12.2020 19:13

это то, что вы хотите сделать?

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
  }
]

Нет, это не то, чего хочет ОП.

Scott Marcus 23.12.2020 18:48

спасибо за ваше предложение, но на самом деле это не то, что я искал, поскольку эти индексы продолжаются.

Ant 23.12.2020 23:11

Другие вопросы по теме