albert sh
albert sh

Reputation: 1193

how to change value of all nodes of json array

I have a json array with different key values and need to add a ServerUrl to the beginning of all node values using a loop without writing multiple statements to do that by using javascript:

"Urls": [
    { "getCar": "/getAllCars" },
    { "getPerson": "/getAllPersons" },
    { "getBook": "/getAllBooks" }
],
"ServerUrl": "http://192.168.1.1:3000"

The expected result must be:

"Urls": [
    { "getCar": "http://192.168.1.1:3000/getAllCars" },
    { "getPerson": "http://192.168.1.1:3000/getAllPersons" },
    { "getBook": "http://192.168.1.1:3000/getAllBooks" }
],

Any advice would be appreciated.

Upvotes: 1

Views: 675

Answers (4)

F.bernal
F.bernal

Reputation: 2684

A version that modifies your own object

var obj = {
    "Urls": [
        { "getCar": "/getAllCars" },
        { "getPerson": "/getAllPersons" },
        { "getBook": "/getAllBooks" }
    ],
    "ServerUrl": "http://192.168.1.1:3000"
};

obj.Urls.forEach(o => o[Object.keys(o)[0]] = `${obj.ServerUrl}${o[Object.keys(o)[0]]}`);

console.log(obj);

Upvotes: 1

Kamil Kiełczewski
Kamil Kiełczewski

Reputation: 92327

Try (where your data are in d)

d.Urls.forEach( (x,i,a,k=Object.keys(x)[0]) => x[k] = d.ServerUrl + x[k]);

let d = {
  "Urls": [
    { "getCar": "/GetAllGroupCustomers" },
    { "getPerson": "/getAllItems" },
    { "getBook": "/GetAllCustomers" }
  ],
  "ServerUrl": "http://192.168.1.1:3000"
}

d.Urls.forEach( (x,i,a,k=Object.keys(x)[0]) => x[k] = d.ServerUrl + x[k]);

console.log(d);

Upvotes: 1

pascalpuetz
pascalpuetz

Reputation: 5418

const jsonVal = {
   "Urls": [
      { "getCar": "/getAllCars" },
      { "getPerson": "/getAllPersons" },
      { "getBook": "/getAllBooks" }
   ],
   "ServerUrl": "http://192.168.1.1:3000"
}

const result = jsonVal.Urls.map(val => 
   Object.keys(val).reduce((resultObj, endpointKey) => {
      resultObj[endpointKey] = `${jsonVal.ServerUrl}${val[endpointKey]}`;
      return resultObj;
   }, {})
);

Upvotes: 1

trincot
trincot

Reputation: 350034

You can use map to map your objects to new objects. Those objects have a single property, which you can get with Object.keys. The new object can get that same property name using the computed property name feature:

var obj = {
    "Urls": [
        { "getCar": "/getAllCars" },
        { "getPerson": "/getAllPersons" },
        { "getBook": "/getAllBooks" }
    ],
    "ServerUrl": "http://192.168.1.1:3000"
};

var urls = obj.Urls.map(o => Object.keys(o).map(k => ({ [k]: obj.ServerUrl + o[k] }))[0]);

console.log(urls);

Upvotes: 4

Related Questions