Как преобразовать массив js в другую форму?

У меня есть этот массив:

 [
        {
            "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)
    }
  }
}

Надеюсь, я предоставил достаточно информации

Обновлено: Я изменил вопрос, чтобы улучшить читаемость массива

Не могли бы вы поместить содержимое изображения в виде текста? Как связаны эти две структуры данных? (Например, где значение 9 в новой структуре данных?)

Ben Stephens 21.04.2023 09:24

Не могли бы вы объяснить логику преобразования массива в желаемую форму?

Srushti Shah 21.04.2023 09:35

Вопрос: свойство value всегда является массивом независимо от его длины? Например, если есть 1 значение, оно все равно будет внутри массива. верно? (речь о начальном массиве)

KyloDev 21.04.2023 09:43

@KyloDev да, исходный массив всегда является массивом

Max_10 21.04.2023 09:49

@BenStephens я отредактировал вопрос, не могли бы вы просмотреть?

Max_10 21.04.2023 09:49

Я думаю, что ваш первоначальный.... пример лучше. После того, как вы изменили детализацию и значение, меня это смутило

Chan 21.04.2023 09:50

В более ранней версии входного массива у вас был один из массивов значений с более короткой длиной, чем другие, возможно ли это?

Ben Stephens 21.04.2023 14:06

@BenStephens да, это возможно

Max_10 22.04.2023 05:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
8
103
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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"

Max_10 21.04.2023 10:47

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);

это не сработает, если количество элементов в массивах значений в каждом массиве разное. Вам придется это исправить

KyloDev 21.04.2023 12:29

Вы можете использовать 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);

Да, это то, что я хотел. Большое спасибо. Спасибо и другим, кто пытался помочь

Max_10 22.04.2023 05:07
Ответ принят как подходящий

Помогает ли следующее? Пожалуйста, смотрите комментарии для небольшой информации о том, что это делает.

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);

Спасибо, это то, что я хотел. Поскольку ваш ответ более подробный, я приму его

Max_10 22.04.2023 05:10

Другие вопросы по теме