使用JavaScript获取未展平的过滤多维数组

时间:2019-02-23 06:05:27

标签: javascript multidimensional-array filter

我能够将矩阵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.log(Wmin)

我使用了for循环,但是将得到的Wmin数组展平了。我的目标是能够过滤W并仍然获得未展平的2D阵列。

我得到Wmin = [ 15, 35, 45, 12, 34 ],但是期望的数组应该是Wmin = [ [15, 35], [45], [12, 34] ]

2 个答案:

答案 0 :(得分:7)

您可以使用mapfilter

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.log(op)

  

为什么我的代码不起作用

您要将值直接推入内部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.log(Wmin)

答案 1 :(得分:1)

解决此问题的另一种方法是使用Array.slice()复制原始数组,然后遍历此副本的元素,删除不符合条件的数字(即大于或等于中位数)与Array.splice()

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.log(Wmin);

或者,如果您愿意,也可以使用Array.reduce()Array.filter()来解决这个问题:

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.log(Wmin);