【问题标题】:How to dynamically build a javascript Object and push into Array within nested loop?如何动态构建一个javascript对象并在嵌套循环中推入数组?
【发布时间】:2021-02-13 09:01:30
【问题描述】:

我正在尝试动态构建对象并将它们一一推送到数组中。

到目前为止我的代码是这样的:

matrix([[0,1,1], [1,00], [1,1,1])

const matrix = (sequence) => {
   const rows = {}
   const rowsAry = []
   let row
   let idx
  
   for (let i=0; i < samples.length; i++) {
       row = `row${i}`
    
       for (let j=0; j < samples[i].length; j++) {
          if (samples[i][j] === 1) {
               idx = []
               rows[row] = rows[row] + 1 || 1 
               rows['indeces'] = idx.push(j)  
               rowsAry.push(rows)
            }
            
        }
    }
    console.log(rowsAry)

}

这显然行不通。我正在尝试绘制序列中的所有“1”,并知道一行中有多少个以及索引是什么。

错误的输出是:

[ { row0: 3, indeces: 1, row1: 2, row2: 2 },
  { row0: 3, indeces: 1, row1: 2, row2: 2 },
  { row0: 3, indeces: 1, row1: 2, row2: 2 },
  { row0: 3, indeces: 1, row1: 2, row2: 2 },
  { row0: 3, indeces: 1, row1: 2, row2: 2 },
  { row0: 3, indeces: 1, row1: 2, row2: 2 },
  { row0: 3, indeces: 1, row1: 2, row2: 2 },
  { row0: 3, indeces: 1, row1: 2, row2: 2 },
  { row0: 3, indeces: 1, row1: 2, row2: 2 } ]

希望输出是:

[{row1: 2, indices: [1,2]}, 
 {row2: 1, indices: [0]}, 
 {row3: 3, indices: [0,1,2]}
] 

【问题讨论】:

  • 为什么在每个对象中使用不同的rowX 键?
  • 您正在循环访问samples。不应该是sequence吗?
  • 是的,你是对的。

标签: javascript arrays object matrix mapping


【解决方案1】:

每次通过外循环都需要创建一个新对象。并且只将其推送到rowsAry 一次,而不是每次都通过内部循环。

const matrix = (samples) => {
  const rowsAry = []

  for (let i = 0; i < samples.length; i++) {
    let row = `row${i}`
    let indices = [];
    for (let j = 0; j < samples[i].length; j++) {
      if (samples[i][j] === 1) {
        indices.push(j);
      }
    }
    rowsAry.push({[row]: indices.length, indices: indices});
  }
  console.log(rowsAry)
}

matrix([
  [0, 1, 1],
  [1, 00],
  [1, 1, 1]
])

【讨论】:

    【解决方案2】:

    您可以通过简单地使用数组 ma​​pforEach 方法来解决它。遍历数组数组并使用数组 forEach 方法检查内部数组是否存在,如果找到则将其放入结果数组。最后,使用结果数组制作您需要的对象。

    const matrix = (sequence) => {
      return sequence.map((x, i) => {
        const ret = [];
        x.forEach((y, j) => {
          if (y === 1) ret.push(j);
        });
        const key = `row${i + 1}`;
        const obj = { [key]: ret.length, indices: ret };
        return obj;
      });
    };
    
    const ret = matrix([
      [0, 1, 1],
      [1, 0, 0],
      [1, 1, 1],
    ]);
    console.log(ret);

    【讨论】:

      【解决方案3】:

      或嵌套reduce() 调用...

      const matrix = (sequence) => {
         return sequence.reduce((a, r, i) => {
          indices = r.reduce((ra, rn, ri) => {
            if (rn === 1) ra.push(ri);
            return ra;
          }, []);
          
          a.push({[`row${i}`]: indices.length, indices: indices});
          return a;
        }, []);
      }
      
      console.log(matrix([[0,1,1], [1,0,0], [1,1,1]]))

      但参考 Barmar 关于使用不同的 rowX 键的评论,您的对象的更易于访问的形状可能看起来类似于

      {row: 1, count: 2, indices: [1, 2]}
      

      【讨论】:

        猜你喜欢
        • 2023-03-25
        • 2020-11-03
        • 2021-11-17
        • 2020-10-24
        • 2021-02-09
        • 1970-01-01
        • 2021-03-31
        • 2017-01-22
        • 2022-01-03
        相关资源
        最近更新 更多