Получить несглаженный отфильтрованный многомерный массив в Javascript

Я могу отфильтровать элементы матрицы 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] ]

Как вы определяете результаты, используя [ 40, 55, 65 ];?

zer00ne 23.02.2019 07:10

Я использовал библиотеку mathjs для получения медианы каждой внутренней матрицы, вот код const median = []; for (let j = 0; j < W.length; j++) { median[j] = math.median(W[j]); }

Isaac 23.02.2019 07:12

Используйте let для wmin, если вы планируете изменить его позже. Небольшое предложение

Shyam Babu 23.02.2019 08:21
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
8
3
203
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать карта и фильтр

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);

Другие вопросы по теме