Я пытаюсь объединить огромный массив объектов в один объект, но мои операторы 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.
Какой конечный результат вы ищете?
Это была моя ошибка, я объявил obj как {}. И Т.Дж. ответ устраивает.



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


Попробуйте следовать
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 - неправильный инструмент, если не использует массив, который он создает. Редактировать: О, и что сказал Джереми. :-)
Я считаю, что вас проголосовали против, потому что obj должен быть объектом. obj[el.resource.name] не будет работать с массивом, и ваш код этого не исправил.
@ T.J. Crowder - Согласен. Добавление деталей
@JeremyThille - В идеале вы правы, однако вы также можете установить свойство в массив, как и объект. Хотя я обновил свой ответ.
Если вы не используете результат, 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;
}
});
Спасибо большое, это действительно помогло мне. Я понимаю, что это был не правильный и не очень красивый код. Теперь я знаю, как это сделать правильно и лучше.
Избегайте двух операторов 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"]
То же самое и со всеми остальными, потому что это условие подразумевает наличие el.resource.name === "FORM01". Следовательно, obj[el.resource.name] === obj["FORM01"].
Спасибо, я тоже попробую это решение. Он намного чище, чем мой)
@JeremyThille - я имел в виду, что вы сбрасываете. В конце цикла будет только одна клавиша.
Да, я понял, о чем вы, и повторяю свой предыдущий комментарий :) Если el.resource.name === "FORM01", то писать obj[el.resource.name] точно так же, как писать obj["FORM01"]. Итак, я сделал это. Это то, что делает код OP.
Я понимаю. Но когда вы назначаете его с помощью =, вы в основном сбрасываете его. Следовательно, результирующий объект будет иметь только 1 пару ключ / значение. И ОП этого не хочет
Небольшой пример "огромный массив объектов" может помочь решить проблему ..?