我能够将矩阵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] ]
答案 0 :(得分:7)
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);