Как динамически создавать объект javascript и вставлять в массив во вложенном цикле?

#javascript #arrays #object #matrix #mapping

#javascript #массивы #объект #матрица #отображение

Вопрос:

Я пытаюсь динамически создавать объекты и помещать их один за другим в массив.

Мой код пока таков:

 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]}
] 

  

Комментарии:

1. Почему вы используете разные rowX ключи в каждом объекте?

2. Вы перебираете цикл samples . Разве это не должно быть sequence ?

3. Да, вы правы.

Ответ №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:

Вы можете решить эту проблему, просто используя карту массива и метод forEach. Пройдите по массиву массивов и проверьте наличие единиц во внутреннем массиве, используя метод array 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]]))  

Но в связи с комментарием Бармара об использовании разных rowX ключей более доступная форма для ваших объектов может выглядеть примерно так

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