Volatil3
Volatil3

Reputation: 14998

AngularJS: How to search and replace/add key in JSON object from other JSON?

I have a JSON in this format:

JSON No 1

{
  "status": "ok",
  "data": [{
    "id": 1,
    "name": "building No1",
    "floor": 5,
    "code": {
      "1": [{
        "id": 1,
        "code": "MCD-001",
        "selected": false
      }, {
        "id": 2,
        "code": "MCD-002",
        "selected": false
      }],
      "2": [{
        "id": 3,
        "code": "MCD-003",
        "selected": false
      }],
      "3": [{
        "id": 4,
        "code": "MCD-004",
        "selected": false
      }, {
        "id": 5,
        "code": "MCD-004-bis",
        "selected": false
      }, {
        "id": 6,
        "code": "MCD-005",
        "selected": false
      }],
      "4": [{
        "id": 7,
        "code": "MCD-006",
        "selected": false
      }],
      "6": [{
        "id": 8,
        "code": "MCD-007",
        "selected": false
      }],
      "7": [{
        "id": 9,
        "code": "MCD-008",
        "selected": false
      }, {
        "id": 10,
        "code": "MCD-009",
        "selected": false
      }]
    },
    "building_name": "Test Tower",
    "number_lot": true,
    "parking_floor": 0,
    "creation_date": {
      "date": "2017-01-30 00:00:00.000000",
      "timezone_type": 3,
      "timezone": "UTC"
    }
  }]
}

I have another JSON, something like this:

JSON No 2

{
  "LOTS": {
    "1": [{
      "id": 1,
      "code": "LOT-001",
      "floor": 1,
      "selected": true
    }, {
      "id": 2,
      "code": "MCD-002",
      "floor": 1,
      "selected": true
    }],
    "7": [{
      "id": 9,
      "code": "MCD-008",
      "floor": 7,
      "selected": true
    }, {
      "id": 10,
      "code": "MCD-009",
      "floor": 7,
      "selected": true
    }]
  }
}

Now what I want to set "selected":true in the JSON 1 key where code is MCD-008 and id:9

Does AngularJS provide someway to do either at template or controller end?

All I want to set button's classes to "default" or "primary". This thing is already being done. All I need to pass selected:true

Upvotes: 1

Views: 664

Answers (1)

Nina Scholz
Nina Scholz

Reputation: 386680

You could use a hash table and het first the id and code from the source object and the interate the replacment object and set the values.

var data1 = { status: "ok", data: [{ id: 1, name: "building No1", floor: 5, code: { "1": [{ id: 1, code: "MCD-001", selected: false }, { id: 2, code: "MCD-002", selected: false }], "2": [{ id: 3, code: "MCD-003", selected: false }], "3": [{ id: 4, code: "MCD-004", selected: false }, { id: 5, code: "MCD-004-bis", selected: false }, { id: 6, code: "MCD-005", selected: false }], "4": [{ id: 7, code: "MCD-006", selected: false }], "6": [{ id: 8, code: "MCD-007", selected: false }], "7": [{ id: 9, code: "MCD-008", selected: false }, { id: 10, code: "MCD-009", selected: false }] }, building_name: "Test Tower", number_lot: true, parking_floor: 0, creation_date: { date: "2017-01-30 00:00:00.000000", timezone_type: 3, timezone: "UTC" } }] },
    data2 = { LOTS: { "1": [{ id: 1, code: "LOT-001", floor: 1, selected: true }, { id: 2, code: "MCD-002", floor: 1, selected: true }], "7": [{ id: 9, code: "MCD-008", floor: 7, selected: true }, { id: 10, code: "MCD-009", floor: 7, selected: true }] } },
    hash = Object.create(null);

data1.data.forEach(function (o) {
    Object.keys(o.code).forEach(function (k) {
        o.code[k].forEach(function (a) {
            var key = [a.id, a.code].join('|');
            hash[key] = a;
        });
    });
});

Object.keys(data2.LOTS).forEach(function (k) {
    data2.LOTS[k].forEach(function (a) {
        var key = [a.id, a.code].join('|');
        if (hash[key]) {
            hash[key].selected = a.selected;
        }
    });
});

console.log(data1);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 1

Related Questions