Поэлементная фильтрация зубчатого многомерного массива с массивом 1D в Javascript - PullRequest
1 голос
/ 11 июля 2019

const Amaths = [
    [1, 2, 3, 5, 6, 7, 8],
    [4, 5, 6, 8],
    [12, 3, 4]
]
const checks = [2.5, 4.01, 5];
const picks = [];
for (let j = 0; j < Amaths.length; j++) {
    for (let k = 0; k < Amaths[j].length; k++) {
        if (Amaths[j][k] > checks[j]) {
            picks.push(Amaths[j][k]);
        }
    }
}

console.log("picks", picks)

Я хочу отфильтровать зубчатый многомерный массив элемент-wis без выравнивания выходного массива; в этом примере «выбирает».

Я попытался использовать цикл for, но вывод "picks" сглажен. Кроме того, я использовал библиотечную функцию mathjs, но кажется, что поэлементные арифметические операции в этой библиотеке работают только для не зубчатых многомерных массивов.

Ожидаемый результат должен быть:

const picks =  [ [3, 5, 6, 7, 8], [5, 6, 8], [12] ]

console.log ("expected picks", picks)

1 Ответ

2 голосов
/ 11 июля 2019

Используйте .map для преобразования в другой двумерный массив, вызывая .filter на каждом подмассиве, сравнивая с checks для индекса повторяющегося подмассива:

const Amaths = [
    [1, 2, 3, 5, 6, 7, 8],
    [4, 5, 6, 8],
    [12, 3, 4]
]
const checks = [2.5, 4.01, 5];

const result = Amaths.map(
  (subarr, i) => subarr.filter(
    num => num >= checks[i]
  )
);
console.log(result);

Чтобы исправить исходный код, вам нужно будет выдвигать новый подмассив к picks на каждой внешней итерации:

const Amaths = [
    [1, 2, 3, 5, 6, 7, 8],
    [4, 5, 6, 8],
    [12, 3, 4]
]
const checks = [2.5, 4.01, 5];
const picks = [];
for (let j = 0; j < Amaths.length; j++) {
    picks.push([]);
    for (let k = 0; k < Amaths[j].length; k++) {
        if (Amaths[j][k] > checks[j]) {
            picks[j].push(Amaths[j][k]);
        }
    }
}

console.log("picks", picks)

(но методы массива, вероятно, здесь намного лучше, они намного более кратки и просты для понимания)

...