@Demarkpro

Как оптимизировать цикл for трёхуровневой вложенностью?

Здравствуйте, я новичок, поэтому возможно не знаю очевидного. Есть два массива и цикл:
const arr1 = [
    [432432, 23423, 123123, 54364346],
    [756456, 2423423, 645654, 23423423],
    [12354, 123123, 23423423,1235765]
];

const arr3 = [12354, 5345, 53456346];
const arrResult = [];

for (let i = 0; i < arr1.length; ++i) {
    for (let j = 0; j < arr1[i].length; ++j) {
        for (let k = 0; k < arr3.length; ++k) {
            if (arr1[i][j] === arr3[k]) {
                arrResult.push(arr1[i][j]);
                break;
            }
        }
    }
}

console.log(arrResult);


Так, как в первом массиве может быть достаточно много значений, от 500 000, хотелось бы узнать, могу ли я как то оптимизировать все это дело? Так как сейчас это занимает достаточно долгое время. Заранее спасибо
  • Вопрос задан
  • 165 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Если в лоб:
const arr1 = [
  [ 432432, 23423, 123123, 54364346],
  [ 756456, 2423423, 645654, 23423423],
  [ 12354, 123123, 23423423, 1235765]
]

const arr3 = [ 12354, 5345, 53456346 ]

const arrResult = arr1
  .flat(Infinity)
  .filter(el => arr3.includes(el))

console.log(arrResult)

// Array [ 12354 ]

Если оптимизировать по времени, за счёт памяти:
const arr1 = [
  [ 432432, 23423, 123123, 54364346],
  [ 756456, 2423423, 645654, 23423423],
  [ 12354, 123123, 23423423, 1235765]
]

const arr3 = [ 12354, 5345, 53456346 ]

const arr1s = arr1.flat(Infinity)
arr1s.sort((a, b) => a - b)

const arr3s = arr3.slice()
arr3s.sort((a, b) => a - b)

const arrResult = []

for (let i = 0, let j = 0; i < arr1s.length, j < arr3s.length;) {
  if (arr1s[i] === arr3s[j]) {
    arrResult.push(arr1s[i])
    i += 1
  } else if (arr1s[i] < arr3s[j]) {
    i += 1
  } else {
    j += 1
  }
}

console.log(arrResult)

// Array [ 12354 ]

Правда, в обоих случаях надо смотреть поведение при наличии дублей в каждом из массивов.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы