Преобразование формата многомерного массива Javascript

У меня есть массив, который выглядит так -

var myOldArray = [{
        "id": 1,
        "form_id": 4,
        "form_field_name": "field_1",
        "helperTitle": "This is Box 1's TItle",
        "helperText": "This is Box 1 data",
        "created_at": null,
        "updated_at": null
    },
    {
        "id": 2,
        "form_id": 4,
        "form_field_name": "field_2",
        "helperTitle": "Box 2 Title",
        "helperText": "Box 2 TExt",
        "created_at": null,
        "updated_at": null
    }
]

и мне нужно продублировать / скопировать / преобразовать / ... что угодно ... этот массив примерно так -

myNewArray = {
  field_1['title'] = "This is Box 1's Title",
  field_1['text'] = "This is Box 1 data",
  field_2['title'] = "Box 2 Title",
  field_2['text'] = "Box 2 Text",
}

так что я могу ссылаться на него

  console.info(myNewArray.field_1.title) 

или что-то более полезное.

Я безрезультатно пытался использовать метод фильтрации. Все, что я пытался, просто возвращает undefined. Я просто супер запутался. Есть ли лучший способ напрямую ссылаться на элементы в субмассиве без преобразования?

Это вроде как работало ... console.info выводит то, что я хотел, но возвращаемое значение выводилось как undefined, что меня сбивает.

myOldArray = [{
    "id": 1,
    "form_id": 4,
    "form_field_name": "field_1",
    "helperTitle": "This is Box 1's TItle",
    "helperText": "This is Box 1 data",
    "created_at": null,
    "updated_at": null
  },
  {
    "id": 2,
    "form_id": 4,
    "form_field_name": "field_2",
    "helperTitle": "Box 2 Title",
    "helperText": "Box 2 TExt",
    "created_at": null,
    "updated_at": null
  }
]
var AR = myOldArray;
var newArr = AR.filter(function(item) {
  if (item.form_field_name == fieldName) {
    console.info('txt - ' + item + '\n\n');
    return item;
  }
});

Опубликованный вопрос, похоже, вообще не включает любая попытка для решения проблемы. StackOverflow ожидает, что вы попробуй сначала решить свою проблему, поскольку ваши попытки помогают нам лучше понять, чего вы хотите. Измените вопрос, чтобы показать, что вы пробовали, и проиллюстрировать конкретное препятствие, с которым вы столкнулись с минимальный воспроизводимый пример. Для получения дополнительной информации см. Как спросить и возьмите тур.

CertainPerformance 01.01.2019 11:09

Кстати, ваш myNewArray должен быть объектом, а не массивом, потому что вы используете именованные свойства вместо ключей.

Nina Scholz 01.01.2019 11:12

Да, я думал, что использовал фигурные скобки на myNewArray, но я пытался решить эту проблему около 6 часов ... утомление наступило ... Я исправил это.

Deadlance 01.01.2019 11:17

Что не так (или не работает) с myOldArray[0].helperTitle?

Ben 01.01.2019 11:17

Я не знаю, какой индекс массива мне нужен, когда я его выводю. Мне нужно ссылаться на определенные индексы - IE, мне нужно вывести helperTitle для индекса, где form_field_name = field_2, и я не знаю, является ли этот индекс 0 или 1, или в этом массиве может быть 100 элементов.

Deadlance 01.01.2019 11:19

Пожалуйста, обновите фрагмент, который я сделал для вас, соответствующим HTML

mplungjan 01.01.2019 11:19

@Deadlance Похоже, вам действительно нужно немного больше узнать о структурах данных в JS ...

Ben 01.01.2019 11:22

@Ben Я работаю над тем, чтобы узнать как можно больше и как можно быстрее. Это просто странная проблема, на которой я застрял. Я не могу понять, как получить конкретные индексы многомерных массивов через пару ключ / значение вместо их индекса.

Deadlance 01.01.2019 11:32
Поведение ключевого слова "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) для оценки ваших знаний,...
1
8
70
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете сопоставить элементы в новых объектах с желаемыми свойствами как объекты.

Работает с

var data = [{ id: 1, form_id: 4, form_field_name: "field_1", helperTitle: "This is Box 1's TItle", helperText: "This is Box 1 data", created_at: null, updated_at: null }, { id: 2, form_id: 4, form_field_name: "field_2", helperTitle: "Box 2 Title", helperText: "Box 2 TExt", created_at: null, updated_at: null }],
    result = Object.assign(
        ...data.map(({ id, helperTitle: title, helperText: text }) =>
            ({ ['field_' + id]: { title, text } }))
    );

console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

По-видимому, у меня проблемы с размещением кода в комментариях ... но я получаю сообщение об ошибке с предоставленным вами кодом, в котором говорится, что невозможно преобразовать undefined в объект.

Deadlance 01.01.2019 11:30

$ .get ('/ api / system / formHelperText / 4', function (data) {if (data) {this.helpText = data;}} .bind (this)); var X = this.helpText; console.info (X); результат = Object.assign (... X.map (({id, helperTitle: title, helperText: text}) => ({['field_' + id]: {title, text}}))); console.info (результат);

Deadlance 01.01.2019 11:34

это похоже на асинхронную проблему, из-за undefined вы видите массив в console.info? можно взять элемент из массива?

Nina Scholz 01.01.2019 11:37

@Deadlance вам не нужно анализировать строку JSON для объекта

Slai 01.01.2019 11:38

в моем плохо отформатированном выше коде первый console.info (X) действительно выводит массив в журнал, но console.info (результат) выдает ошибку

Deadlance 01.01.2019 11:39

@Slai Я так не думаю. console.info (this.helpText [0] .helperTitle); выводит правильную строку. Проблема, с которой я столкнулся, заключается в том, что я не хочу выводить строку из [0] ... Мне нужно получить строку для индекса, где form_field_name = конкретная вещь.

Deadlance 01.01.2019 11:45

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

Nina Scholz 01.01.2019 12:04

@ninaScholz, похоже, проблема с асинхронностью ... Теперь выясним, как исправить эту проблему ...

Deadlance 01.01.2019 12:06

@deadlance stackoverflow.com/questions/23667086/…

Jonas Wilms 01.01.2019 12:15

Я предполагаю, что вся обработка должна выполняться в функции $ .get:

$.getJSON('/api/system/formHelperText/4', function (data) { 
    var myNewArray = data.map(function(item) {
        var obj = {};
        obj['field_' + item.id] = { Title: item.helperTitle, Text: item.helperText };
        return obj;
    });
    console.info(myNewArray);
};

Вы можете написать простой вызов reduce, чтобы получить желаемый результат:

const array=[{id:1,form_id:4,form_field_name:"field_1",helperTitle:"This is Box 1's TItle",helperText:"This is Box 1 data",created_at:null,updated_at:null},{id:2,form_id:4,form_field_name:"field_2",helperTitle:"Box 2 Title",helperText:"Box 2 TExt",created_at:null,updated_at:null}]

const result= array.reduce((acc, a) => 
  (acc[a.form_field_name] = {title: a.helperTitle,text: a.helperText}, acc), {});

console.info(result);

Ответ очень простой:

const objs = new Map();

for (const obj of myOldArray) {
    objs.set(obj.form_field_name, obj);
}

И теперь вы можете получить доступ к своим объектам по имени поля:

const myObj = objs.get("field_1");

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