Добавление полей к объекту с помощью оператора if в js - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь объединить огромный массив объектов в один объект, но мои операторы 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.

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Если вы не используете результат, 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;
    }
});
0 голосов
/ 31 августа 2018

Избегайте двух 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 };
    }
});
0 голосов
/ 31 августа 2018

Попробуйте выполнить

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...