Получить индекс значения для сгруппированного массива - PullRequest
0 голосов
/ 07 июля 2019

У меня есть массив Ids

 [1,1,1,2,2,2,3,3,...]

И еще один массив values

[0,1,0,0,0,1,1,0,...]

Мне нужно знать, что такое нулевой индекс группы Ids, где соответствующее значение 1 в JavaScript.

Так что для этого массива мы можем получить
[1,2,0,...] потому что это индекс 1 в массиве значений, если вы должны сгруппировать массив Id по их уникальным значениям.

Должен быть только один 1 на группу идентификаторов. Существует вероятность того, что группа идентификаторов может быть не в последовательном порядке

(т.е. [1,1,2,1,2,2,3,3,...]).

Но я все равно хотел бы иметь индекс, когда массив Id сгруппирован.

Я пробовал цикл while, но получал повторяющиеся значения. Затем я попытался отфильтровать мой массив. Как я могу сделать это в JS?

Примеры:

array 1 (IDs) : [1,1,1,2,2,2,3,3,3,3] .   
array 2 (values) : [0,1,0,0,1,0,0,0,0,1] .  
result array: [1,1,3] .  

array 3 (IDs) : [1,2,1,3,1,1,2,2,3] .  
array 4 ( values) : [0,0,1,0,0,0,1,0,1] .  
result array : [1,1,1] . 

1 Ответ

3 голосов
/ 07 июля 2019

Вы можете взять счетчик индекса для той же группы и получить значение, если найдено значение с единицей.

Пример 3:

[1, 2, 1, 3, 1, 1, 2, 2, 3]  ids
[0, 0, 1, 0, 0, 0, 1, 0, 1]  values
 0  0  1  0  2  3  1  2  1   indices by group
       ^           ^     ^   result

function getIndices(ids, values) {
    var map = new Map;
    return ids.reduce((r, v, i) => {
        if (values[i] === 1) r.push(map.get(v) || 0);
        map.set(v, (map.get(v) || 0) + 1);
        return r;
    }, []);
}

// [1, 2, 0]
console.log(...getIndices([1, 1, 1, 2, 2, 2, 3, 3], [0, 1, 0, 0, 0, 1, 1, 0]));

// [1, 1, 3]
console.log(...getIndices([1, 1, 1, 2, 2, 2, 3, 3, 3, 3], [0, 1, 0, 0, 1, 0, 0, 0, 0, 1]));

// [1, 1, 1]
console.log(...getIndices([1, 2, 1, 3, 1, 1, 2, 2, 3], [0, 0, 1, 0, 0, 0, 1, 0, 1]));

Вместо Map вы можете взять объект в качестве хеш-таблицы для индексации значений.

function getIndices(ids, values) {
    var hash = Object.create(null);
    return ids.reduce((r, v, i) => {
        hash[v] = hash[v] || 0;
        if (values[i] === 1) r.push(hash[v]);
        hash[v]++;
        return r;
    }, []);
}

// [1, 2, 0]
console.log(...getIndices([1, 1, 1, 2, 2, 2, 3, 3], [0, 1, 0, 0, 0, 1, 1, 0]));

// [1, 1, 3]
console.log(...getIndices([1, 1, 1, 2, 2, 2, 3, 3, 3, 3], [0, 1, 0, 0, 1, 0, 0, 0, 0, 1]));

// [1, 1, 1]
console.log(...getIndices([1, 2, 1, 3, 1, 1, 2, 2, 3], [0, 0, 1, 0, 0, 0, 1, 0, 1]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...