Массив карты JavaScript с использованием файла JSON - PullRequest
0 голосов
/ 26 октября 2018

В JavaScript у меня есть массив трехбуквенных кодов, и у меня есть файл JSON, в котором есть значения для каждого из этих кодов. Мне нужно сопоставить коды с соответствующими значениями в файле JSON. Вот пример:

{"Roles" : [
{"code": "cmm", "fullname": "commentator"},
{"code": "cmp", "fullname": "composer"},
{"code": "cnd", "fullname": "conductor"},
{"code": "cng", "fullname": "cinematographer"},
{"code": "cns", "fullname": "censor"},
{"code": "com", "fullname": "compiler"}
]}

var arr = ["cmm", "com", "cng"];
var mappedArray = arr.map( ??? );

//mappedArray now contains: ["commentator", "composer", "cinematographer"]

Я не могу придумать, как решить эту проблему, которая не является ужасно неэффективной. Кто-нибудь может помочь?

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Самый эффективный способ - использовать for / loop :

const data = {"Roles" : [{"code": "cmm", "fullname": "commentator"},{"code": "cmp", "fullname": "composer"},{"code": "cnd", "fullname": "conductor"},{"code": "cng", "fullname": "cinematographer"},{"code": "cns", "fullname": "censor"},{"code": "com", "fullname": "compiler"}]};
var arr = ["cmm", "com", "cng"];

const out = [];
for (let i = 0; i < data.Roles.length; i++) {
  const el = data.Roles[i];
  if (arr.indexOf(el.code) > -1) out.push(el.fullname);
}

console.log(out);

Использование reduce немного более функционально / аккуратно, но не так эффективно. Вы можете извлекать нужные вам данные без необходимости использовать filter затем map.

const data = {"Roles" : [{"code": "cmm", "fullname": "commentator"},{"code": "cmp", "fullname": "composer"},{"code": "cnd", "fullname": "conductor"},{"code": "cng", "fullname": "cinematographer"},{"code": "cns", "fullname": "censor"},{"code": "com", "fullname": "compiler"}]};
var arr = ["cmm", "com", "cng"];

var out = data.Roles.reduce((acc, c) => {
  if (arr.includes(c.code)) acc.push(c.fullname);
  return acc;
}, []);

console.log(out);
0 голосов
/ 26 октября 2018

Вы должны сначала отфильтровать массив, а затем отобразить его, чтобы получить необходимые значения. Вы можете попробовать это

let result1 = obj["Roles"].filter(function(item) { return arr.includes(item.code)}).map(filteredObj => filteredObj.fullname);
0 голосов
/ 26 октября 2018

Этого можно добиться, используя фильтр

var obj = {"Roles" : [
{"code": "cmm", "fullname": "commentator"},
{"code": "cmp", "fullname": "composer"},
{"code": "cnd", "fullname": "conductor"},
{"code": "cng", "fullname": "cinematographer"},
{"code": "cns", "fullname": "censor"},
{"code": "com", "fullname": "compiler"}
]}

var arr = ["cmm", "com", "cng"];

var mappedArray = obj["Roles"].filter(d => arr.includes(d.code))

console.log('Filtered Array', mappedArray)

console.log('Result', mappedArray.map(({fullname}) => fullname))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...