【问题标题】:JavaScript map array using JSON file使用 JSON 文件的 JavaScript 地图数组
【发布时间】:2019-03-31 02:22:30
【问题描述】:

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

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

【问题讨论】:

  • 您应该在问题中添加效率极低的代码。
  • 我想我理解错了。你能写出你的预期输出吗
  • 您正在处理多少数据?假设您没有大量角色(数千个以上),那么在效率上花费大量时间(如果有的话)不太可能。
  • 为什么composer 在你的输出中?你的意思是compiler,对吧?

标签: javascript arrays json dictionary


【解决方案1】:

您可以使用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))

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您必须先过滤数组,然后对其进行映射以获得所需的值.. 你可以试试这个

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-30
        • 2016-10-02
        • 1970-01-01
        • 2021-02-23
        相关资源
        最近更新 更多