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