Объединить свойства объекта переменной длины объекта JavaScript в новое свойство объекта - PullRequest
0 голосов
/ 26 апреля 2018

У меня сложная структура объекта:

myObject = {
    "myObject" : [
        {
            "id" : 1,
            "parameters" : [
                {
                    "name" : "name1",
                    "special" : "xxx"
                },
                {
                    "name" : "name2",
                    "special" : "yyy"           
                }
            ]
        },
        {
            "id" : 2,
            "parameters" : [
                {
                    "name" : "name3",
                    "special" : "zzz"
                }
            ]
        },
        {
            "id" : 2,
            "parameters" : [
                {
                    "name" : "name4",
                    "special" : "ttt"
                },
                {
                    "name" : "name5",
                    "special" : "aaa"
                },
                {
                    "name" : "name6",
                    "special" : "zzz"
                }
            ]
        },
        ...
    ]
};

Он состоит из массива других объектов, каждый из которых имеет переменный номер parameters.

Моя цель - объединить special из parameters каждого объекта в новую строку, которая должна быть сохранена как его новое свойство.

В этом случае результат должен выглядеть следующим образом:

myObject = {
    "myObject" : [
        {
            "id" : 1,
            "parameters" : [
                {
                    "name" : "name1",
                    "special" : "xxx"
                },
                {
                    "name" : "name2",
                    "special" : "yyy"           
                }
            ],
            "newProp" : "xxxyyy"
        },
        {
            "id" : 2,
            "parameters" : [
                {
                    "name" : "name3",
                    "special" : "zzz"
                }
            ],
            "newProp" : "zzz"
        },
        {
            "id" : 2,
            "parameters" : [
                {
                    "name" : "name4",
                    "special" : "ttt"
                },
                {
                    "name" : "name5",
                    "special" : "aaa"
                },
                {
                    "name" : "name6",
                    "special" : "zzz"
                }
            ],
            "newProp" : "tttaaazzz"
        },
        ...
    ]
};

Я пробовал что-то вроде этого:

forEach(arr in myObject.myObject){
    arr.parameters(forEach (i in arr.parameters.special) {
    myObject.myObject = i.concat(myObject.myObject);
  })
}

очевидно, это не работает. Но я думаю, что это может быть правильным подходом.

Есть предложения?

Ответы [ 4 ]

0 голосов
/ 26 апреля 2018

Еще один способ - использовать вложенные функции карты:

myObject = {"myObject":[{"id":1,"parameters":[{"name":"name1","special":"xxx"},{"name":"name2","special":"yyy"}]},{"id":2,"parameters":[{"name":"name3","special":"zzz"}]},{"id":2,"parameters":[{"name":"name4","special":"ttt"},{"name":"name5","special":"aaa"},{"name":"name6","special":"zzz"}]}]};

myObject.myObject.map(x => {
  x.newProp = x.parameters.map(p => p.special).join('');
  return x;
})

console.log(myObject);
0 голосов
/ 26 апреля 2018

Используйте уменьшить и для каждого

var myObject = {
    "myObject" : [
        {
            "id" : 1,
            "parameters" : [
                {
                    "name" : "name1",
                    "special" : "xxx"
                },
                {
                    "name" : "name2",
                    "special" : "yyy"           
                }
            ]
        },
        {
            "id" : 2,
            "parameters" : [
                {
                    "name" : "name3",
                    "special" : "zzz"
                }
            ]
        },
        {
            "id" : 2,
            "parameters" : [
                {
                    "name" : "name4",
                    "special" : "ttt"
                },
                {
                    "name" : "name5",
                    "special" : "aaa"
                },
                {
                    "name" : "name6",
                    "special" : "zzz"
                }
            ]
        }
    ]
};

myObject.myObject.forEach(arr => {
 arr.prop = arr.parameters.reduce((res,obj)=> res+obj.special, '')
})

console.log(myObject)
0 голосов
/ 26 апреля 2018

Вы можете использовать .map() и .reduce() следующим образом:

let myObject = [{"id" : 1, "parameters" : [{ "name" : "name1", "special" : "xxx"}, { "name" : "name2", "special" : "yyy" }]}, { "id" : 2, "parameters" : [{ "name" : "name3", "special" : "zzz"}]}, {"id" : 2, "parameters" : [{ "name" : "name4", "special" : "ttt"}, { "name" : "name5", "special" : "aaa"},{ "name" : "name6", "special" : "zzz"}]}];

let result = myObject.map(
  o => (o.newProp = o['parameters'].reduce((a, o) => a + o['special'], ""), o)
);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 26 апреля 2018

Вы можете перебрать объект, используя Array#forEach, а затем построить строку на основе значений параметров, используя Array#map и Array#join, например это:

const myObject = {"myObject":[{"id":1,"parameters":[{"name":"name1","special":"xxx"},{"name":"name2","special":"yyy"}]},{"id":2,"parameters":[{"name":"name3","special":"zzz"}]},{"id":2,"parameters":[{"name":"name4","special":"ttt"},{"name":"name5","special":"aaa"},{"name":"name6","special":"zzz"}]}]};

myObject.myObject.forEach(item => {
  item.newProp = item.parameters.map(p => p.special).join('');
});

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