Добавление полей к объекту с помощью оператора if в js

Я пытаюсь объединить огромный массив объектов в один объект, но мои операторы if заменяют друг друга:

const obj = [];
res.map((el) => {
    if (el.resource.name === "FORM01" && el.name === "cost.ttl") {
        obj[el.resource.name] = { [el.name]:  el };
    }
    if ( el.resource.name === "FORM01" && el.name === "cost.use") {
        obj[el.resource.name] = { [el.name]:  el };
    }
});

в результате я хочу добавить

obj[el.resource.name] = {}

два поля типа cost.ttl и cost.use.

Небольшой пример "огромный массив объектов" может помочь решить проблему ..?

Teemu 31.08.2018 13:48

Какой конечный результат вы ищете?

T.J. Crowder 31.08.2018 13:50

Это была моя ошибка, я объявил obj как {}. И Т.Дж. ответ устраивает.

Nikita Choty 31.08.2018 15:09
Поведение ключевого слова "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
3
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте следовать

const obj = {}; // Initialize here to an object instead of array
res.map((el) => {
    if (el.resource.name === "FORM01" && (el.name === "cost.ttl" || el.name === "cost.use")) {
        // Check for existing object, else create new object
        obj[el.resource.name] = obj[el.resource.name] || {};
        obj[el.resource.name][el.name] = el; // set the value in object
    }
});

Примечание, Array.map - неправильный выбор здесь для итерации, поскольку вы пытаетесь перебрать массив, получить какое-то значение по условию и сохранить его. Вы можете использовать простой цикл for или forEach.

Предположительно: дампы кода не являются полезными ответами (OP должен угадывать, что вы сделали и почему?), А map - неправильный инструмент, если не использует массив, который он создает. Редактировать: О, и что сказал Джереми. :-)

T.J. Crowder 31.08.2018 13:54

Я считаю, что вас проголосовали против, потому что obj должен быть объектом. obj[el.resource.name] не будет работать с массивом, и ваш код этого не исправил.

Jeremy Thille 31.08.2018 13:54

@ T.J. Crowder - Согласен. Добавление деталей

Nikhil Aggarwal 31.08.2018 13:56

@JeremyThille - В идеале вы правы, однако вы также можете установить свойство в массив, как и объект. Хотя я обновил свой ответ.

Nikhil Aggarwal 31.08.2018 13:57
Ответ принят как подходящий

Если вы не используете результат, map не является подходящим инструментом для циклического просмотра массива. Точно так же, если вы сопоставляете строки со значениями (el.resource.name с объектом), массив не является правильным типом объекта для использования. Просто используйте простой предмет или Map.

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

Неясно, какой конечный результат вы действительно ищете, но, возможно, что-то вроде:

const obj = {};       // *** Object, not array
res.forEach((el) => { // *** forEach, not map
    if (el.resource.name === "FORM01" && (el.name === "cost.ttl" || el.name === "cost.use")) {
        // *** Get the existing object if any; create and store a new one if there isn't already one there
        const entry = obj[el.resource.name] = obj[el.resource.name] || {};
        // *** Add this property to it
        entry[el.name] = el;
    }
});

или вы можете использовать for-of:

const obj = {};
for (const el of res) {
    if (el.resource.name === "FORM01" && (el.name === "cost.ttl" || el.name === "cost.use")) {
        const entry = obj[el.resource.name] = obj[el.resource.name] || {};
        entry[el.name] = el;
    }
});

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

Nikita Choty 31.08.2018 15:12

Избегайте двух операторов if подряд, потому что первый может повлиять на данные, проверяемые вторым.

Кроме того, obj должен быть объектом, а не массивом.

Также используйте .forEach, а не .map, потому что вы ничего не возвращаете из цикла.

const obj = {};
res.forEach( el => {
    if (el.resource.name === "FORM01" && ["cost.ttl","cost.use"].includes(el.name)) {
        obj["FORM01"] = { [el.name]:  el };
    }
});

Вы вроде перезаписываете obj["FORM01"]

Nikhil Aggarwal 31.08.2018 14:03

То же самое и со всеми остальными, потому что это условие подразумевает наличие el.resource.name === "FORM01". Следовательно, obj[el.resource.name] === obj["FORM01"].

Jeremy Thille 31.08.2018 14:44

Спасибо, я тоже попробую это решение. Он намного чище, чем мой)

Nikita Choty 31.08.2018 15:17

@JeremyThille - я имел в виду, что вы сбрасываете. В конце цикла будет только одна клавиша.

Nikhil Aggarwal 31.08.2018 15:25

Да, я понял, о чем вы, и повторяю свой предыдущий комментарий :) Если el.resource.name === "FORM01", то писать obj[el.resource.name] точно так же, как писать obj["FORM01"]. Итак, я сделал это. Это то, что делает код OP.

Jeremy Thille 31.08.2018 15:57

Я понимаю. Но когда вы назначаете его с помощью =, вы в основном сбрасываете его. Следовательно, результирующий объект будет иметь только 1 пару ключ / значение. И ОП этого не хочет

Nikhil Aggarwal 01.09.2018 05:41

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