У меня есть такой массив: ['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, но у меня возникли проблемы.
Не могли бы вы уточнить, как вы пытаетесь нумеровать массив? Вы пытаетесь сопоставить a=0, b=1... z=25? Или вы пытаетесь создать массив индексов? Например, если бы «b» стояло первым в массиве, было бы b = 0?
Можно было бы добавить еще несколько примеров или менее ассоциативный пример, например ['a','a','z','f','a']
-> [0, 1, 2]
['a','a','z','f','a'].map(x => x.charCodeAt(0) - 97)
Это должно быть возможно путем сопоставления значений с уникальным индексом следующим образом:
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]
Привет, спасибо за вашу помощь!
Вы можете использовать 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]
Привет! Большое спасибо за помощь. Хорошего дня!
Что вы пробовали и что не сработало так, как ожидалось?