Например есть двухмерный массив:
[366, 919, 350, 619]
[963, 869, 361, 762]
[906, 122, 946, 798]
[593, 713, 619, 373]
Что не понятно в задаче, подходах к ней? Не понятно в чем вопрос.
Здесь нужно пройтись циклом по всех элементах массива:
arr = [
[366, 919, 350, 619]
[963, 869, 361, 762]
[906, 122, 946, 798]
[593, 713, 619, 373]]
Как найти разницу между всеми элементами и найти минимальную?
Как я понял вопрос про стратегию решения задачи, на него и отвечу:
Решение влоб было бы - взять каждый элемент, получить разницу с каждым элементом, потом найти минимальную разницу. Но этот подход опасен тем что вычислительная сложность такого алгоритма будет расти очень быстро с увеличением количества данных.
Поэтому будем “хитрить”. “минимальная разница”, как я понимаю, это минимальное “расстояние” между двумя точками. Иными словами - модуль от вычитания одного числа из другого. Т.е. минимальная возможная разница это 0.
Если всять все числа из вложенных массивов, сложить в один массив, отсортировать, то мы молучим такую последовательность, в которой “расстояние” между двумя соседними значениями - минимальное возможное. Остается только пробежаться по массиву и получить значения разниц между текущим и последующим элементом (не забыть взять ее по модулю) и сравнить результаты. Для оптимизации нужно прекратить цикл когда минимальная разница получится 0.
Стало понятно как подходить к задаче или остались “пробелы”?
https://codepen.io/anon/pen/mgYWEj
Строки с 26 по 33.
Не выходит сложить в один массив.
Выводит пустой массив.
Проверь что подаешь на вход. В теле функции все выглядит валидно.
В параметры записал массив arr и все равно то самое. А что же тогда нужно ввести?
Я намекаю что если проверить значениt ary
, то окажется что массив-то пуст. Тогда неудивительно что console.log(diff(arr))
дает пустой массив. Следовательно нужно копать в направлении пустоты ary
.
Спасибо, понял и сделал так.
Правда все равно это так и двухуровневый массив.
function diff(ary) {
var newA = [];
ary.push(arr)
for (var i = 0; i < ary.length; i++){
newA.push(ary);
}
return newA;
}
console.log(diff(arr))
А ты хочешь получить одноуровневый?
arr1.push(arr2)
не добавит все элементы arr2
в arr1
, а добавит arr2
целиком как элемент arr1
. Нужен другой метод чтобы получить желаемый результат Array.prototype.concat() - JavaScript | MDN
Я подумал это нужно в одноуровневый массив.
Я свой предыдущий комментарий отредактировал. Может из-за ошибки было непонятно что я имел в виду.
Согласно тому плану что я написал, массив должен быть одноуровневый.
https://codepen.io/anon/pen/WWBOgY?editors=0012
Строки 91-92. Объединить получилось. Не в то место кода вписывал.
Строки 94-101 Получилось найти разницу между числами.
Спасибо
Теперь такой вопрос как найти среди них например 4 самых близких по значению к числу с индексом [5]?
Я верно понял что задача - из массива чисел найти 4 самых близких чисел к числу синдексом X? Как думаешь можно подойти к этой задаче?
Так как мне нужно что-бы это было при наведении на ячейку с числом. Добавлю эту переменную
let closest = oneLevArr.sort( (a, b) => Math.abs(h - a) - Math.abs(h - b) )[0];
в функцию onMoOv() (строка 49).
где, h - избранное число.
В основной функции matrix, в параметрах есть х. Это для выбора количества.
И вот как использовать массив с разницами не знаю. Так как они только между соседними значениями.
Думаю нужно в целом пересмотреть подход к задаче. Потому что не достаточно только " Найти минимальную разницу между элементами двухмерного массива ", самой разницы недостаточно чтобы смоделировать решение.
Пиши новый тред с задачей, как ты ее моделируешь и в чем “загвоздка”.