Фильтрация ключей массива

У меня есть тело объекта, из которого я хочу получить значение ключей. Как я могу получить 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);

у вас есть только одно поле для метки?

Nina Scholz 07.04.2018 11:57

одна поданная? @NinaScholz

Rohan Singh 07.04.2018 11:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
38
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете использовать цикл для всего объекта в массиве:

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 раза

Rohan Singh 07.04.2018 11:59

Как это «в минимальных вычислениях» ??

T.J. Crowder 07.04.2018 12:02

@RohanSingh проверьте сейчас

Ankit Agarwal 07.04.2018 13:14
Ответ принят как подходящий

...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)
, {})

Другие вопросы по теме