【问题标题】:Get unflattened filtered Multidimensional Array in Javascript在Javascript中获取未展平的过滤多维数组
【发布时间】:2019-07-17 05:40:33
【问题描述】:

我能够将矩阵 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 并且仍然得到未展平的二维数组。

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

【问题讨论】:

  • 使用[ 40, 55, 65 ];如何确定结果?
  • 我使用mathjs库来获取每个内部矩阵的中位数,这里是代码const median = []; for (let j = 0; j &lt; W.length; j++) { median[j] = math.median(W[j]); }
  • 如果您希望稍后更改 wmin,请使用 let 。小建议

标签: javascript multidimensional-array filter


【解决方案1】:

您可以使用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)

【讨论】:

    【解决方案2】:

    解决此问题的另一种方法是使用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);

    【讨论】:

      猜你喜欢
      • 2021-05-24
      • 2014-02-11
      • 2020-10-13
      • 2012-08-27
      • 2018-11-15
      • 2012-03-01
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多