Concat и удалить некоторые элементы JSON на основе ключа в массиве - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть объект массива JSON, который имеет свойство id с несколькими записями, и каждая запись имеет еще несколько свойств.Я хочу объединить эти объекты на основе этого id и удалить избыточные данные.Также одно и то же значение идентификатора будет смежно друг с другом.Смотрите данные ниже, чтобы понять больше:

var obj = [  {"Id":13075121312, "p1":"R"}
            ,{"Id":13075121312, "p2":"R"}
            ,{"Id":13075121312, "p3":"R"}
            ,{"Id":9160507252, "p1":"R",}
            ,{"Id":9160507252, "p2":"R",}
            ,{"Id":9160507252, "p3":"R",}
        ] ;

Мне нужно преобразовать этот массив объектов следующим образом:

var obj = [  {"merchantId":13075121312, "p1":"R", "p2":"R", "p3":"R"}
            ,{"merchantId":9160507252, "p1":"R", "p2":"R", "p3":"R"}
        ] ;

Любая помощь будет оценена.Я попробовал следующую функцию, она не работает:

function jsonConcat(obj) {
    for(var i=0; i<obj.length-1; ){
        if(obj[i]['d'] === obj[i+1]['Id']){
            obj[i]['Id'] = obj[i+1]['Id'];
            delete json[obj[i+1]];
        }
        i = i + 1;
    }
    return obj;
}

Спасибо

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Вы можете сделать это, используя forEach() и Spread in object literals

var obj = [  {"Id":13075121312, "p1":"R"}
             ,{"Id":13075121312, "p2":"R"}
            ,{"Id":13075121312, "p3":"R"}
            ,{"Id":9160507252, "p1":"R",}
            ,{"Id":9160507252, "p2":"R",}
            ,{"Id":9160507252, "p3":"R",}
        ] 
        
let result = [];
obj.forEach(a => {
  let same = result.findIndex(b => b.Id === a.Id);
  if(same > -1) result[same] = {...result[same],...a};
  else result.push(a);
})
console.log(result);
0 голосов
/ 14 февраля 2019

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

var obj = [  {"Id":13075121312, "p1":"R"}
                ,{"Id":13075121312, "p2":"R"}
                ,{"Id":13075121312, "p3":"R"}
                ,{"Id":9160507252, "p1":"R",}
                ,{"Id":9160507252, "p2":"R",}
                ,{"Id":9160507252, "p3":"R",}
            ] ;

    var newObj = {};
    for(var i = 0;i < obj.length; i++) {
       var item = obj[i];
        if(!newObj.hasOwnProperty(item['Id'])) { newObj[item['Id']] = {};}
        newObj[item['Id']] = {'merchantId':item['Id'], ...newObj[item['Id']], ...item};  
    }

    var val = Object.values(newObj);
    console.log(val);
0 голосов
/ 14 февраля 2019

Вы можете попробовать следующее, используя Array.reduce и Object.values ​​

var obj = [  {"Id":13075121312, "p1":"R"},{"Id":13075121312, "p2":"R"},{"Id":13075121312, "p3":"R"},{"Id":9160507252, "p1":"R"},{"Id":9160507252, "p2":"R"},{"Id":9160507252, "p3":"R"}];
        
obj = Object.values(obj.reduce((a,{Id, ...rest}) => {
  a[Id] = a[Id] || {merchantId:Id};
  Object.assign(a[Id], rest);
  return a;
}, {}));

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