JavaScript поиск / сравнение и обновление повторяющихся элементов метрического / многомерного массива

#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. Элемент может повторяться только в одном столбце.

  2. Элемент не может встречаться в других столбцах, если он встречается в столбце.

  3. Если возникает указанное выше условие, обновите элемент, добавив индекс столбца ко всем его вхождениям в столбец.

В приведенном выше примере элемент с индексом [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;
}