У меня есть тело объекта, из которого я хочу получить значение ключей.
Как я могу получить membershipId, serviceId, userId с минимальными вычислениями?
Мне нужны только данные, просто я не хочу использовать фильтр 3 раза
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.info(membershipId,serviceId,userId);
одна поданная? @NinaScholz



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать цикл для всего объекта в массиве:
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.info(res);Мне нужны только данные, просто я не хочу использовать фильтр 3 раза
Как это «в минимальных вычислениях» ??
@RohanSingh проверьте сейчас
...in minimum computations
Что ж, повторный цикл по массиву - это не минимум. Вы бы использовали цикл один, возможно, довольно скучный:
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;
}
}
Живой пример:
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.info(membershipId, serviceId, userId);Не интересно, но вы сказали «с минимальными вычислениями». :-)
Это не самый лучший способ лаконичный, но, вероятно, самый эффективный способ выполнения. Возможные настройки:
Если вы знаете, что записи null или undefined никогда не будет, вы можете удалить часть entry && из switch.
Если будет много записей, которые не соответствуют ни одному из случаев, вы можете остановиться раньше, если у вас есть все, что вам нужно.
Вы можете использовать объект и собрать все данные для последующего использования с этикеткой.
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.info(allData);Вы можете создать объект Map и получить из него значения:
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.info(membershipId, serviceId, userId);Для этого удобно использовать Reduce:
const result = body.custom_fields
.reduce((acc, entry) =>
(acc[entry.label] = acc[entry.value], acc)
, {})
у вас есть только одно поле для метки?