Я могу отфильтровать элементы матрицы W на элементы, которые удовлетворяют условному оператору =>, сохраняя элементы в каждой внутренней матрице, которые ниже медианного значения. Элементы медианного массива являются медианными значениями для каждого внутреннего массива.
const W = [[45, 60, 15, 35],[45, 55, 75],[12, 34, 80, 65, 90]
];
const median = [ 40, 55, 65 ];
const Wmin = [];
for (let j = 0; j < W.length; j++) {
for (let k = 0; k < W[j].length; k++) {
if (W[j][k] < median[j]) {
Wmin.push(W[j][k]);
}
}
}
console.info(Wmin)Я использовал цикл for, но результирующий массив Wmin сглажен. Моя цель - иметь возможность фильтровать W и по-прежнему получать несглаженный 2D-массив.
Я получаю Wmin = [ 15, 35, 45, 12, 34 ], но ожидаемый массив должен быть Wmin = [ [15, 35], [45], [12, 34] ]
Я использовал библиотеку mathjs для получения медианы каждой внутренней матрицы, вот код const median = []; for (let j = 0; j < W.length; j++) { median[j] = math.median(W[j]); }
Используйте let для wmin, если вы планируете изменить его позже. Небольшое предложение



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать карта и фильтр
const W = [[45, 60, 15, 35],[45, 55, 75],[12, 34, 80, 65, 90]];
const median = [ 40, 55, 65 ];
const op = W.map(( inp, index) => inp.filter(e => e < median[index]))
console.info(op)Why my code is not working
Вы помещаете значения непосредственно в массив внутри внутреннего цикла for, вам нужно создать временный массив и поместить в него значение во внутреннем цикле, а временное поместить в Wmin во внешнем цикле.
const W = [[45, 60, 15, 35],[45, 55, 75],[12, 34, 80, 65, 90]];
const median = [ 40, 55, 65 ];
const Wmin = [];
for (let j = 0; j < W.length; j++) {
let temp = []
for (let k = 0; k < W[j].length; k++) {
if (W[j][k] < median[j]) {
temp.push(W[j][k]);
}
}
Wmin.push(temp)
}
console.info(Wmin)Другой альтернативой для решения этой проблемы может быть создание копии исходного массива с Массив.срез(), а затем перебор элементов этой копии, удаление чисел, которые не соответствуют условию (т.е. больше или равны медиане) с Массив.сращивание().
const W = [[45, 60, 15, 35],[45, 55, 75],[12, 34, 80, 65, 90]];
const median = [40, 55, 65];
// Clone the original array.
let Wmin = W.slice();
// Delete elements from the cloned array.
for (let j = 0; j < Wmin.length; j++)
{
for (let k = 0; k < Wmin[j].length; k++)
{
if (Wmin[j][k] >= median[j])
{
Wmin[j].splice(k, 1);
--k;
}
}
}
console.info(Wmin);Или, если хотите, вы также можете подойти к этому с Массив.уменьшить() и Массив.фильтр():
const W = [[45, 60, 15, 35],[45, 55, 75],[12, 34, 80, 65, 90]];
const median = [40, 55, 65];
let Wmin = W.reduce(
(acc, arr, i) => (acc.push(arr.filter(x => x < median[i])) && acc),
[]
);
console.info(Wmin);
Как вы определяете результаты, используя
[ 40, 55, 65 ];?