0

I have a JSON file which has duplicate keys and i want to merge the duplicate key and their values to one record.

Example:

The Json looks like this:

{
  "numbers": {
    "0BJA10GH001": {
      "links": [
        {
          "name": "RI-Fliessbild: RG MFB L3 RI_002",
          "path": "/C1_RI-Fliessbilder/C1.1/3/RG MFB L3 RI_002.pdf",
          "searchNumber": true
        },
        {
          "name": "Katalog Sensor: TGM / siehe 0BJA10GH001 -1_5.1",
          "path": "/1_Verfahrenstechnik/Teil B/1_B5/1_B5.1/01_0BJA10GH001.pdf",
          "searchNumber": false
        },
        {
          "name": "Datenblatt: 0BJA10GH001",
          "path": "/Datenblaetter Messstellenliste/RG MFB L3 RI_002/0BJA10GH001.pdf",
          "searchNumber": false
        }
      ],
      "aliases": [
        "0BJA10GH001"
      ]
    },


"0BJA10GH001": {
  "links": [
    {
      "name": "RI-Fliessbild: RG MFB L3 RI_002",
      "path": "/C1_RI-Fliessbilder/C1.1/3/RG MFB L3 RI_002.pdf",
      "searchNumber": true
    },
    {
      "name": "Komponentenbeschreibung: TGM / ---",
      "path": "/1_Verfahrenstechnik/Teil B/1_B5/1_B5.1/01_0BJA10GH001.pdf",
      "searchNumber": false
    },
    {
      "name": "Datenblatt: 0BJA10GH001",
      "path": "/Datenblaetter Apparateliste/RG MFB L3 RI_002/0BJA10GH001.pdf",
      "searchNumber": false
    }
  ],
  "aliases": [
    "0BJA10GH001"
  ]
}

} }

I want it to look like that:

{
  "numbers": {
    "0BJA10GH001": {
      "links": [
        {
          "name": "RI-Fliessbild: RG MFB L3 RI_002",
          "path": "/C1_RI-Fliessbilder/C1.1/3/RG MFB L3 RI_002.pdf",
          "searchNumber": true
        },
        {
          "name": "Katalog Sensor: TGM / siehe 0BJA10GH001 -1_5.1",
          "path": "/1_Verfahrenstechnik/Teil B/1_B5/1_B5.1/01_0BJA10GH001.pdf",
          "searchNumber": false
        },
        {
          "name": "Datenblatt: 0BJA10GH001",
          "path": "/Datenblaetter Messstellenliste/RG MFB L3 RI_002/0BJA10GH001.pdf"
        },
        {
          "name": "Komponentenbeschreibung: TGM / ---",
          "path": "/1_Verfahrenstechnik/Teil B/1_B5/1_B5.1/01_0BJA10GH001.pdf",
          "searchNumber": false
        },
        {
          "name": "Datenblatt: 0BJA10GH001",
          "path": "/Datenblaetter Apparateliste/RG MFB L3 RI_002/0BJA10GH001.pdf",
          "searchNumber": false
        }
      ],
      "aliases": [
        "0BJA10GH001"
      ]
    }
  }
}

The two keys "0BJA10GH001" which are the same merge and the duplicate values inside get removed.

var SeatWithCat = [{"0BJA10GH001" : { "links" : [{ "name" : "RI-Fliessbild: RG MFB L3 RI_002", "path" : "/C1_RI-Fliessbilder/C1.1/3/RG MFB L3 RI_002.pdf", "searchNumber" : true },{ "name" : "Katalog Sensor: TGM / siehe 0BJA10GH001 -1_5.1", "path" : "/1_Verfahrenstechnik/Teil B/1_B5/1_B5.1/01_0BJA10GH001.pdf", "searchNumber" : false },{ "name" : "Datenblatt: 0BJA10GH001", "path" : "/Datenblaetter Messstellenliste/RG MFB L3 RI_002/0BJA10GH001.pdf", "searchNumber" : false }], "aliases" : ["0BJA10GH001"] },
"0BJA10GH001" : { "links" : [{ "name" : "RI-Fliessbild: RG MFB L3 RI_002", "path" : "/C1_RI-Fliessbilder/C1.1/3/RG MFB L3 RI_002.pdf", "searchNumber" : true },{ "name" : "Komponentenbeschreibung: TGM / ---", "path" : "/1_Verfahrenstechnik/Teil B/1_B5/1_B5.1/01_0BJA10GH001.pdf", "searchNumber" : false },{ "name" : "Datenblatt: 0BJA10GH001", "path" : "/Datenblaetter Apparateliste/RG MFB L3 RI_002/0BJA10GH001.pdf", "searchNumber" : false }], "aliases" : ["0BJA10GH001"] },
"0BMC10GH001" : { "links" : [{ "name" : "RI-Fliessbild: RG MFB L3 RI_002", "path" : "/C1_RI-Fliessbilder/C1.1/3/RG MFB L3 RI_002.pdf", "searchNumber" : true },{ "name" : "Katalog Sensor: TGM / siehe 0BMC10GH001 -1_5.1", "path" : "/1_Verfahrenstechnik/Teil B/1_B5/1_B5.1/01_0BMC10GH001.pdf", "searchNumber" : false },{ "name" : "Datenblatt: 0BMC10GH001", "path" : "/Datenblaetter Messstellenliste/RG MFB L3 RI_002/0BMC10GH001.pdf", "searchNumber" : false }], "aliases" : ["0BMC10GH001"] },
"0BMC10GH001" : { "links" : [{ "name" : "RI-Fliessbild: RG MFB L3 RI_002", "path" : "/C1_RI-Fliessbilder/C1.1/3/RG MFB L3 RI_002.pdf", "searchNumber" : true },{ "name" : "Komponentenbeschreibung: TGM / ---", "path" : "/1_Verfahrenstechnik/Teil B/1_B5/1_B5.1/01_0BMC10GH001.pdf", "searchNumber" : false },{ "name" : "Datenblatt: 0BMC10GH001", "path" : "/Datenblaetter Apparateliste/RG MFB L3 RI_002/0BMC10GH001.pdf", "searchNumber" : false }], "aliases" : ["0BMC10GH001"] },
"0CFB01BB020" : { "links" : [{ "name" : "RI-Fliessbild: 90034652", "path" : "/C1_RI-Fliessbilder/C1.1/1_2/90034652.pdf", "searchNumber" : true },{ "name" : "Komponentenbeschreibung: Messer Gas / HCl in N2", "path" : "/1_Verfahrenstechnik/Teil B/1_B7/1_B7.5/01_0CFB01BB020.pdf", "searchNumber" : false },{ "name" : "Datenblatt: 0CFB01BB020", "path" : "/Datenblaetter Apparateliste/90034652/0CFB01BB020.pdf", "searchNumber" : false }], "aliases" : ["0CFB01BB020"] },
"0CFB01BB021" : { "links" : [{ "name" : "RI-Fliessbild: 90034652", "path" : "/C1_RI-Fliessbilder/C1.1/1_2/90034652.pdf", "searchNumber" : true },{ "name" : "Komponentenbeschreibung: Messer Gas / NH3 in N2", "path" : "/1_Verfahrenstechnik/Teil B/1_B7/1_B7.5/01_0CFB01BB021.pdf", "searchNumber" : false },{ "name" : "Datenblatt: 0CFB01BB021", "path" : "/Datenblaetter Apparateliste/90034652/0CFB01BB021.pdf", "searchNumber" : false }], "aliases" : ["0CFB01BB021"] }}];

function combine(arr) {
  var combined = arr.reduce(function(result, item) {
    var current = result[item.key];


    result[item.key] = !current ? item : {
      kks: item.key,
    };

    return result;
  }, {});

  return Object.keys(combined).map(function(key) {
    return combined[key.key];
  });
}

var result = combine(SeatWithCat);

console.log(result);
document.write(JSON.stringify(result));

This is my Code so far and it works for the first part. It removes the double keys "0BJA10GH001" but the values inside the array don't join from the duplicate key.

Each key "0BJA10GH001" has an "links" array inside it and these "links" arrays should join each other when the duplicates get merged.

All values inside the duplicate keys "0BJA10GH001" should join into one array. How can i achieve that? And one step further, how can i delete the duplicates inside an array?

Thanks a lot.

Code Now:

var SeatWithCat = [{"0BJA10GH001" : { "links" : [{ "name" : "RI-Fliessbild: RG MFB L3 RI_002", "path" : "/C1_RI-Fliessbilder/C1.1/3/RG MFB L3 RI_002.pdf", "searchNumber" : true },{ "name" : "Katalog Sensor: TGM / siehe 0BJA10GH001 -1_5.1", "path" : "/1_Verfahrenstechnik/Teil B/1_B5/1_B5.1/01_0BJA10GH001.pdf", "searchNumber" : false },{ "name" : "Datenblatt: 0BJA10GH001", "path" : "/Datenblaetter Messstellenliste/RG MFB L3 RI_002/0BJA10GH001.pdf", "searchNumber" : false }], "aliases" : ["0BJA10GH001"] },
"0BJA10GH001" : { "links" : [{ "name" : "RI-Fliessbild: RG MFB L3 RI_002", "path" : "/C1_RI-Fliessbilder/C1.1/3/RG MFB L3 RI_002.pdf", "searchNumber" : true },{ "name" : "Komponentenbeschreibung: TGM / ---", "path" : "/1_Verfahrenstechnik/Teil B/1_B5/1_B5.1/01_0BJA10GH001.pdf", "searchNumber" : false },{ "name" : "Datenblatt: 0BJA10GH001", "path" : "/Datenblaetter Apparateliste/RG MFB L3 RI_002/0BJA10GH001.pdf", "searchNumber" : false }], "aliases" : ["0BJA10GH001"] },
"0BMC10GH001" : { "links" : [{ "name" : "RI-Fliessbild: RG MFB L3 RI_002", "path" : "/C1_RI-Fliessbilder/C1.1/3/RG MFB L3 RI_002.pdf", "searchNumber" : true },{ "name" : "Katalog Sensor: TGM / siehe 0BMC10GH001 -1_5.1", "path" : "/1_Verfahrenstechnik/Teil B/1_B5/1_B5.1/01_0BMC10GH001.pdf", "searchNumber" : false },{ "name" : "Datenblatt: 0BMC10GH001", "path" : "/Datenblaetter Messstellenliste/RG MFB L3 RI_002/0BMC10GH001.pdf", "searchNumber" : false }], "aliases" : ["0BMC10GH001"] },
"0BMC10GH001" : { "links" : [{ "name" : "RI-Fliessbild: RG MFB L3 RI_002", "path" : "/C1_RI-Fliessbilder/C1.1/3/RG MFB L3 RI_002.pdf", "searchNumber" : true },{ "name" : "Komponentenbeschreibung: TGM / ---", "path" : "/1_Verfahrenstechnik/Teil B/1_B5/1_B5.1/01_0BMC10GH001.pdf", "searchNumber" : false },{ "name" : "Datenblatt: 0BMC10GH001", "path" : "/Datenblaetter Apparateliste/RG MFB L3 RI_002/0BMC10GH001.pdf", "searchNumber" : false }], "aliases" : ["0BMC10GH001"] },
"0CFB01BB020" : { "links" : [{ "name" : "RI-Fliessbild: 90034652", "path" : "/C1_RI-Fliessbilder/C1.1/1_2/90034652.pdf", "searchNumber" : true },{ "name" : "Komponentenbeschreibung: Messer Gas / HCl in N2", "path" : "/1_Verfahrenstechnik/Teil B/1_B7/1_B7.5/01_0CFB01BB020.pdf", "searchNumber" : false },{ "name" : "Datenblatt: 0CFB01BB020", "path" : "/Datenblaetter Apparateliste/90034652/0CFB01BB020.pdf", "searchNumber" : false }], "aliases" : ["0CFB01BB020"] },
"0CFB01BB021" : { "links" : [{ "name" : "RI-Fliessbild: 90034652", "path" : "/C1_RI-Fliessbilder/C1.1/1_2/90034652.pdf", "searchNumber" : true },{ "name" : "Komponentenbeschreibung: Messer Gas / NH3 in N2", "path" : "/1_Verfahrenstechnik/Teil B/1_B7/1_B7.5/01_0CFB01BB021.pdf", "searchNumber" : false },{ "name" : "Datenblatt: 0CFB01BB021", "path" : "/Datenblaetter Apparateliste/90034652/0CFB01BB021.pdf", "searchNumber" : false }], "aliases" : ["0CFB01BB021"] }}];

function combine(arr) {
  var combined = arr.reduce(function(result, item) {
    var current = result[item.key];
    

    result[item.key] = !current ? item : {
      kks: item.key,
    };

    return result;
  }, {});

  return Object.keys(combined).map(function(key) {
    return combined[key.key];
  });
}

var result = combine(SeatWithCat);

console.log(result);
  • Please format your answer, especially code blocks. – Arount Jul 12 '17 at 09:13
  • 1
    You can't have duplicate keys in javascript object. Your object is wrong. – Shubham Jul 12 '17 at 09:13
  • I want to remove the duplicates by merge them with their counterparts. – Silvan Kaufmann Jul 12 '17 at 09:16
  • @silvankaufmann You mean you want to merge "0BJA10GH001" value to "0BJA10GsH001"? – Wasif Khan Jul 12 '17 at 09:19
  • Try to look at this solution [https://stackoverflow.com/a/8432188/2268099](https://stackoverflow.com/a/8432188/2268099) Hope this helps. – Ridwan Jul 12 '17 at 09:24
  • @WasifKhan no, sorry that was a typo. I want to merge the duplicates, in this case 0BJA10GH001 and 0BJA10GH001 – Silvan Kaufmann Jul 12 '17 at 09:25
  • 1
    @silvankaufmann in javascript when you try to make json with duplicate keys it will automatically merge and set value to the later one. – Wasif Khan Jul 12 '17 at 09:28
  • @WasifKhan Maybe i have to tell the whole story: I have a list with Json in it like the json above (24800 records). All of the json records have keys like "0BJA10GH001". Some of these keys are unique and some are double. This Json file is used for a mobile application as search index. Therefore the search result has to be unique. Thats why i want to merge the keys and remove the duplicate values inside the records. – Silvan Kaufmann Jul 12 '17 at 09:40
  • @silvankaufmann okay I get it. I can give you psudo code for it and can you tell me how do you merge it, means you make differnet object in link array when values of name and path are different? – Wasif Khan Jul 12 '17 at 09:47
  • @WasifKhan Yes. The merge part should be clear right? If the keys are the same, they should merge, means in the links array if "name" and "path" values are double one of the dublicates in the links array shoud be removed (The part which should get removed in the links array starts with { and ends with }, ). – Silvan Kaufmann Jul 12 '17 at 09:59

1 Answers1

0

Finding Duplicate Keys code:

var data = yourJson.numbers;
var keys = Object.keys(data);
var sizeOfData = keys.length;
for (var i=0; i < sizeOfData-1; i++){
 for (var j=i; j< sizeOfData-1; j++){
        if(keys[i] == keys[j+1]){
             // here i and j+1 have same key and need another algo for merge
        }
    }
}
Wasif Khan
  • 956
  • 7
  • 25