Rohan Singh
Rohan Singh

Reputation: 91

Filtering array keys

I have an object body from which I want to fetch value of is keys. How can I fetch the membershipId, serviceId, userId in minimum computations?

I want data only its just i dont want to use filter 3 times

var body = {
  "custom_fields": [{
    "label": "membership_id",
    "data": "1",
  }, {
    "label": "service_id",
    "data": "1",

  }, {
    "label": "user_id",
    "data": "26134",
  }]
};

var membershipInfo = body.custom_fields.filter(n=>{
  return n.label == "membership_id";
});

var serviceInfo = body.custom_fields.filter(n=>{
  return n.label == "service_id";
})
var userInfo = body.custom_fields.filter(n=>{
  return n.label == "user_id";
})

var membershipId = membershipInfo[0].data;
var serviceId    = serviceInfo[0].data;
var userId       = userInfo[0].data;

console.log(membershipId,serviceId,userId);

Upvotes: 2

Views: 41

Answers (5)

eosterberg
eosterberg

Reputation: 1452

Reduce is handy for that:

const result = body.custom_fields
.reduce((acc, entry) =>
  (acc[entry.label] = acc[entry.value], acc)
, {})

Upvotes: 1

Mohammad Usman
Mohammad Usman

Reputation: 39392

You can create a Map object and get values from it:

let body = {"custom_fields": [{"label": "membership_id","data": "1",}, {"label": "service_id", "data": "1"}, {"label": "user_id","data": "26134"}]},
    map = new Map(body["custom_fields"].map(o => [o["label"], o["data"]]));

let membershipId = map.get("membership_id");
let serviceId    = map.get("service_id");
let userId       = map.get("user_id");

console.log(membershipId, serviceId, userId);

Upvotes: 1

Nina Scholz
Nina Scholz

Reputation: 386868

You could use an object and collect all data for later use with the label.

var body = { custom_fields: [{ label: "membership_id", data: "1" }, { label: "service_id", data: "1" }, { label: "user_id", data: "26134" }] },
    allData = Object.create(null);

body.custom_fields.forEach(({ label, data }) => allData[label] = data);

console.log(allData);

Upvotes: 1

Ankit Agarwal
Ankit Agarwal

Reputation: 30729

You can use a loop for all the object in the array:

var body = {
    "custom_fields": [{
        "label": "membership_id",
        "data": "1",
    }, {
        "label": "service_id",
        "data": "1",

    }, {
        "label": "user_id",
        "data": "26134",
    }]
};
var res = [];

body.custom_fields.forEach((item)=> {
 var obj = {};
 obj[item['label']] = item['data'];
 res.push(obj);
});
console.log(res);

Upvotes: 1

T.J. Crowder
T.J. Crowder

Reputation: 1075755

...in minimum computations

Well, repeatedly looping through the array isn't minimum. You'd use one loop, probably a fairly boring one:

var membershipId, serviceId, userId;
var fields = body.custom_fields;
for (var i = 0, len = fields.length; i < len; ++i) {
    var entry = fields[i];
    switch (entry && entry.label) {
        case "membership_id":
            membershipId = entry.data;
            break;
        case "service_id":
            serviceId = entry.data;
            break;
        case "user_id":
            userId = entry.data;
            break;
    }
}

Live Example:

var body = {
    "custom_fields": [{
        "label": "membership_id",
        "data": "1",
    }, {
        "label": "service_id",
        "data": "1",

    }, {
        "label": "user_id",
        "data": "26134",
    }]
};

var membershipId, serviceId, userId;
var fields = body.custom_fields;
for (var i = 0; i < fields.length; ++i) {
    var entry = fields[i];
    switch (entry && entry.label) {
        case "membership_id":
            membershipId = entry.data;
            break;
        case "service_id":
            serviceId = entry.data;
            break;
        case "user_id":
            userId = entry.data;
            break;
    }
}

console.log(membershipId, serviceId, userId);

Not exciting, but you said "in minimum computations." :-)

That's not the most concise way, but it's probably the most runtime-efficient way. Tweaks you could make:

  • If you know there will never be a null or undefined entry, you can remove the entry && part in the switch

  • If there will be lots of entries that won't match any of the cases, you might stop early if you've got all you need

Upvotes: 1

Related Questions