Почему Object удаляет повторяющиеся элементы из массива целых чисел - PullRequest
0 голосов
/ 06 августа 2020

Я решаю задачу и столкнулся с этой проблемой, когда пытался преобразовать массив целых чисел в объект. Объект будет нести элементы массива как ключи, а его индексы как значение, я пробовал что-то вроде этого:

let array = [2, 2, 4, 3]
let dic = {};

//Method # 1
array.forEach((item, index) => dic[item] = index)

//Method # 2
for(var i = 0; i < array.length; i++){
    dic[array[i]] = i;
}

//Method # 3
dic = new Map()
for(var i = 0; i < array.length; i++){
    dic.set(arra[i] ,i);
}

Все они дали мне одинаковые результаты, т.е. 2 в массиве дублируется, и он его удаляет. Я этого не хочу.

Ответы [ 2 ]

2 голосов
/ 06 августа 2020

Что делается во всех ваших решениях с примером первого метода:

//Method # 1
array.forEach((item, index) => dic[item] = index)

приведет к:

dic[2] = 0
dic[2] = 1 // will overwrite the previous value
dic[3] = 2
dic[4] = 3

Как вы можете видеть, ни один элемент не удаляется, но dic[2] будет перезаписано.

Если вы хотите отобразить массив с неуникальными значениями в хэш-карту, тогда вместо скалярных значений вы можете просто добавить элементы в массив, например:

TypeScript Hashmap будет выглядеть так:

type MyMap = Record<number, number[]>

Код:

const map = array.reduce((result, current, index) => ({
  ...result,
  [current]: [...(result[index] || []), index]
}), {});

array.reduce reference

1 голос
/ 06 августа 2020

Вы не можете использовать повторяющиеся ключи. Почему вы используете значения в качестве ключей вместо индексов? Если вы используете индексы в качестве ключа и сохраните значение, он будет работать:

array.forEach((item, index) => dic[index] = item)
...