У меня есть этот массив:
[
{
"number": 1,
"detail": detail1,
"value": [1, 11, 21, 31]
},
{
"number": 2,
"detail": detail2,
"value": [2, 12, 22, 32]
},
{
"number": 3,
"detail": detail3,
"value": [3, 13, 23, 33]
}
]
А мне нужно в таком виде:
[
[
{detail: detail1, value: 1},
{detail: detail2, value: 2},
{detail: detail3, value: 3},
],
[
{detail: detail1, value: 11},
{detail: detail2, value: 12},
{detail: detail3, value: 13},
],
[
{detail: detail1, value: 21},
{detail: detail2, value: 22},
{detail: detail3, value: 23},
],
[
{detail: detail1, value: 31},
{detail: detail2, value: 32},
{detail: detail3, value: 33},
],
...
]
Как я мог это сделать? Спасибо за помощь
Я попытался сделать это с помощью цикла, как показано ниже, но не смог получить эту форму:
const result = []
for (let i = 0; i < array[0].value.length; i++) {
for (let j = 1; j < array.length; j++) {
for (let k = 0; k < array[j].value.length; k++) {
result.push(values)
}
}
}
Надеюсь, я предоставил достаточно информации
Обновлено: Я изменил вопрос, чтобы улучшить читаемость массива
Не могли бы вы объяснить логику преобразования массива в желаемую форму?
Вопрос: свойство value всегда является массивом независимо от его длины? Например, если есть 1 значение, оно все равно будет внутри массива. верно? (речь о начальном массиве)
@KyloDev да, исходный массив всегда является массивом
@BenStephens я отредактировал вопрос, не могли бы вы просмотреть?
Я думаю, что ваш первоначальный.... пример лучше. После того, как вы изменили детализацию и значение, меня это смутило
В более ранней версии входного массива у вас был один из массивов значений с более короткой длиной, чем другие, возможно ли это?
@BenStephens да, это возможно



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


const starting_arr = [{
"number": 1,
"detail": 4,
"value": [5, 6, 9]
},
{
"number": 2,
"detail": 5,
"value": [7, 8]
},
{
"number": 3,
"detail": 6,
"value": [13, 14, 15]
}
];
function ArrayExpand(arr) {
const output_arr = [];
for (let i = 0; i < arr.length; i++) {
output_arr.push([]);
const {
number,
detail,
value
} = arr[i]; // destructuring the object
for (let j = 0; j < value.length; j++) {
output_arr[i].push({
number,
detail,
value: value[j]
})
}
}
return output_arr
}
console.info(ArrayExpand(starting_arr))это должно сделать это.
Мы инициализируем выходной массив, в который мы будем помещать расширенные формы отдельных объектов.
В каждом объекте «i» я помещаю пустой массив в выходной массив. Затем для каждого элемента 'j' в значении я помещаю новый расширенный объект в пустой массив.
каждый массив внутри output_array должен содержать три объекта, потому что у нас есть три разных детали (деталь1, деталь2, деталь3), и эти объекты должны содержать «значение». эти «значения» уникальны в каждом массиве, например: если в первом массиве в объекте, где значение «подробности» равно «детали1», а «значение» равно «значению1», во втором массиве в объекте, где деталь равна значению «деталь1» не может быть "value1"
const d = [
[
{ detail: "detail1", value: "value1" },
{ detail: "detail2", value: "value2" },
{ detail: "detail3", value: "value3" },
],
[
{ detail: "detail1", value: "value11" },
{ detail: "detail2", value: "value12" },
{ detail: "detail3", value: "value13" },
],
[
{ detail: "detail1", value: "value21" },
{ detail: "detail2", value: "value22" },
{ detail: "detail3", value: "value23" },
],
[
{ detail: "detail1", value: "value31" },
{ detail: "detail2", value: "value32" },
{ detail: "detail3", value: "value33" },
],
]
const x = [
{
"number": 1,
"detail": "detail1",
"value": ["value1", "value11", "value21", "value31"]
},
{
"number": 2,
"detail": "detail2",
"value": ["value2", "value12", "value22", "value32"]
},
{
"number": 3,
"detail": "detail3",
"value": ["value3", "value13", "value23", "value33"]
}
]
let desired = []
for (let i = 0; i < 4; i++) {
let a = [];
for (let j = 0; j < x.length; j++) {
a.push({
detail: x[j].detail,
value: x[j].value[i]
})
}
desired.push(a);
}
console.info('desired: ', desired);это не сработает, если количество элементов в массивах значений в каждом массиве разное. Вам придется это исправить
Вы можете использовать map и foreach с деструктированием для преобразования ваших данных:
const inputArray = [
{
"number": 1,
"detail": 1,
"value": [1, 11, 21, 31]
},
{
"number": 2,
"detail": 2,
"value": [2, 12, 22, 32]
},
{
"number": 3,
"detail": 3,
"value": [3, 13, 23, 33]
}
];
const result = inputArray[0].value.map((_, idx) => {
const values = [];
inputArray.forEach(({ detail, value }) => {
values.push({ detail, value: value[idx] });
});
return values;
});
console.info(result);Да, это то, что я хотел. Большое спасибо. Спасибо и другим, кто пытался помочь
Помогает ли следующее? Пожалуйста, смотрите комментарии для небольшой информации о том, что это делает.
const items = [
{
"number": 1,
"detail": 1,
"value": [1, 11, 21, 31]
},
{
"number": 2,
"detail": 2,
"value": [2, 12, 22, 32]
},
{
"number": 3,
"detail": 3,
"value": [3, 13, 23, 33]
},
// added to show what might happen if there are gaps
{
"number": 5,
"detail": 5,
"value": [5, 15, 25]
}
];
// work out the max length of the value arrays
const new_length = Math.max(...items.map((v) => v.value.length));
// create a new array of length new_length and prepopulate with fresh arrays
const result = Array.from({ length: new_length }, () => []);
// for each item create a new entry in the correct result sub array for each
// of the values in the item value array
for(const item of items) {
for(const index in result) {
const value = item.value[index];
if (value)
result[index][item.number - 1] = { detail: item.detail, value };
}
}
console.info(result);Спасибо, это то, что я хотел. Поскольку ваш ответ более подробный, я приму его
Не могли бы вы поместить содержимое изображения в виде текста? Как связаны эти две структуры данных? (Например, где значение 9 в новой структуре данных?)