Как пронумеровать массив?

У меня есть такой массив: ['a', 'a', 'b', 'c', 'a']

Я хочу получить это: [0, 0, 1, 2, 0]

Идея состоит в том, чтобы присвоить первому значению массива arr1 значение 0, второму — 1 и т. д.

Я попробовал это:

function onlyUnique(value, index, array) {
  return array.indexOf(value) === index;
}
let arr1 = ['a', 'a', 'b', 'c', 'a' ]
var arr1_uniq= arr1.filter(onlyUnique);
let k=0
var list = []
for (let i in arr1_uniq){
    list.push(k)
    k++
}

Итак, у меня есть arr1 без дубликата: ['a', 'b', 'c'] И соответствующие значения: [0, 1, 2]

И, наконец, я попытался использовать функцию findIndex для перераспределения значений arr1, но у меня возникли проблемы.

Что вы пробовали и что не сработало так, как ожидалось?

David 13.08.2024 15:18

Не могли бы вы уточнить, как вы пытаетесь нумеровать массив? Вы пытаетесь сопоставить a=0, b=1... z=25? Или вы пытаетесь создать массив индексов? Например, если бы «b» стояло первым в массиве, было бы b = 0?

Kylaaa 13.08.2024 15:21

Можно было бы добавить еще несколько примеров или менее ассоциативный пример, например ['a','a','z','f','a'] -> [0, 1, 2]

fdomn-m 13.08.2024 15:32
['a','a','z','f','a'].map(x => x.charCodeAt(0) - 97)
evolutionxbox 13.08.2024 15:59
Поведение ключевого слова "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) для оценки ваших знаний,...
2
4
63
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это должно быть возможно путем сопоставления значений с уникальным индексом следующим образом:

function indexMapper(arr) {
    const uniqueValues = [...new Set(arr)];
    const inverseMap = Object.fromEntries(uniqueValues.map((val, index) => [val, index]));
    return arr.map(value => inverseMap[value]);
}

// Example usage
let arr1 = ['a', 'a', 'b', 'c', 'a'];
let result = indexMapper(arr1);
console.info(result);  // [0, 0, 1, 2, 0]

Привет, спасибо за вашу помощь!

nbs335 13.08.2024 16:20

Вы можете использовать Map<Object, Number> и счетчик для отслеживания индексов.

const indexArray = (arr) => {
  const lookup = new Map();
  let currIndex = 0;
  return arr.map((item) => {
    if (lookup.has(item)) return lookup.get(item);
    lookup.set(item, currIndex);
    return currIndex++;
  });
};

const arr = ['a', 'a', 'b', 'c', 'a'];
const res = indexArray(arr);

console.info(...res); // [0, 0, 1, 2, 0]

Вы можете устранить необходимость в currIndex, если воспользуетесь свойством size карты.

const indexArray = (arr) => {
  const lookup = new Map();
  return arr.map((item) => {
    if (!lookup.has(item)) {
      lookup.set(item, lookup.size);
    }
    return lookup.get(item);
  });
};

const arr = ['a', 'a', 'b', 'c', 'a'];
const res = indexArray(arr);

console.info(...res); // [0, 0, 1, 2, 0]

Вот это в одну строку:

const indexArray = (arr) =>
  (lookup =>
    arr.map((item) =>
      (lookup.has(item)
        ? lookup
        : lookup.set(item, lookup.size)
      ).get(item)))
  (new Map());

const arr = ['a', 'a', 'b', 'c', 'a'];
const res = indexArray(arr);

console.info(...res); // [0, 0, 1, 2, 0]

А теперь код гольфа:

// 64 bytes
f=a=>(m=>a.map(e=>(m.has(e)?m:m.set(e,m.size)).get(e)))(new Map)

console.info(...f(['a', 'a', 'b', 'c', 'a'])) // [0, 0, 1, 2, 0]
Ответ принят как подходящий

Вот желаемый пример кода с использованием Map:

function mapToIndexes(arr) {
    const map = new Map();
    return arr.map((item, index) => {
        if (!map.has(item)) {
            map.set(item, map.size);
        }
        return map.get(item);
    });
}

const arr = ['a', 'a', 'b', 'c', 'a'];
const result = mapToIndexes(arr);
console.info(result); // Output: [0, 0, 1, 2, 0]

Привет! Большое спасибо за помощь. Хорошего дня!

nbs335 13.08.2024 16:20

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