#javascript #multidimensional-array #ecmascript-5
#javascript #многомерный-массив #ecmascript-5
Вопрос:
У меня есть метрический / многомерный массив, как показано ниже
[
[a,b,c,d],
[d,a,c,b],
[a,d,b,a],
[c,c,d,a]
]
Мне необходимо обновить заданную метрику и отслеживать изменения таким образом
-
Элемент может повторяться только в одном столбце.
-
Элемент не может встречаться в других столбцах, если он встречается в столбце.
-
Если возникает указанное выше условие, обновите элемент, добавив индекс столбца ко всем его вхождениям в столбец.
В приведенном выше примере элемент с индексом [1] [1] (‘a’ в строке 2 и столбце 2) встречается в столбце 1. Он и все его вхождения должны обновиться до ‘a1’. Аналогично ‘d’ и ‘c’ должны обновиться до ‘d1’ и ‘c1’ соответственно.
В следующем столбце столбец 3, ‘c’, ‘b’, ‘d’ в столбце 3 должны обновиться до ‘c2’, ‘b2’, ‘d2’, потому что ‘b’ произошел в столбце 2, аналогично ‘c’ и ‘d’ произошли раньше.
В следующем столбце столбец 4 ‘d’, ‘b’, ‘a’ обновится до ‘d4’, ‘b4’, ‘a4’.
Результирующая метрика будет выглядеть следующим образом
[
[a,b, c3,d4],
[d,a2,c3,b4],
[a,d2,b3,a4],
[c,c2,d3,a4]
]
Отслеживать часть
, которую мы можем отслеживать, например
var dictionary = [{"updatedValue":"originalValue"},...]
var dictionary = [{"a2":"a"},{"d2","d"},{"c2","c"},{"c3":"c"},{"b3":"b"},{"d3":"d"},{"d4","d"},{"a4":"a"},{"b4","b"}];
до сих пор я пробовал это
var flatData = [
['a', 'b', 'c', 'd'],
['d', 'a', 'c', 'b'],
['a', 'd', 'b', 'a'],
['c', 'c', 'd', 'a'],
];
for (var i = 0; i < flatData.length; i ) {
for (var j = 0; j < flatData[i].length; j ) {
var element = flatData[i][j];
for (var k = 0; k < flatData.length; k ) {
for (var l = 0; l < flatData[k].length; l ) {
if (j != l) {
if (element == flatData[k][l]) {
flatData[k][l] = flatData[k][l] l;
}
}
}
}
}
}
console.log(JSON.stringify(flatData));
Комментарии:
1. Что вы пробовали и где вы застряли? Почему бы вам не опубликовать действительные данные, чтобы другим не нужно было делать их действительными для их запуска? Показанный ожидаемый словарь немного сбивает с толку
Ответ №1:
Решение использует карту (также может быть простым объектом), где при первом обнаружении значения создается новая запись с объектом {col: firstColIndexFound, count:0}
.
При следующем обнаружении того же значения он проверяет сохраненный индекс столбца и, если отличается, обновляет счетчик и создает новое значение
const data = [
['a', 'b', 'c', 'd'],
['d', 'a', 'c', 'b'],
['a', 'd', 'b', 'a'],
['c', 'c', 'd', 'a']
];
const dict = {};
const map = new Map();
for (let c = 0; c < data[0].length; c ) { // c for colIndex
for (let r = 0; r < data.length; r ) { // r for rowIndex
const el = data[r][c];
if (!map.has(el)) {
// first time found create new entry
map.set(el, {col: c, count: 0});
}
const entry = map.get(el);
// if column index different than first column found update value
if (c !== entry.col) {
entry.count ;
const nVal = el entry.count;
dict[nVal] = el;
data[r][c] = nVal;
}
}
}
console.log(JSON.stringify(data))
console.log(dict)
.as-console-wrapper {
max-height: 100%!important;
top: 0;
}