使用JSON文件对JavaScript数组进行映射

3

在 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"]

我想不出一种解决方法,而且所有的方法都非常低效。有人可以帮忙吗?


你应该将你效率极低的代码添加到你的问题中。 - Andy
我觉得我理解错了。你能否请你写下你期望的输出? - Nitish Narang
你所处理的数据量有多大?假设你没有大量的角色(数千个以上),那么效率不值得花费太多时间来关注。 - DBS
1
为什么你的输出中有 composer?你是指 compiler,对吧? - Andy
3个回答

2
你可以使用 filter 方法来实现这一点。

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))


1
最有效的方法仍然是使用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

你需要先对数组进行筛选,然后再映射以获取所需的值...你可以尝试这样做

let result1 = obj["Roles"].filter(function(item) { return arr.includes(item.code)}).map(filteredObj => filteredObj.fullname);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接