繁体   English   中英

JavaScript:将数组简化为嵌套对象

[英]JavaScript: Reduce an array to nested objects

所以假设我的数组看起来像这样:

let langArr = [
     ["python", "blue"]
    ,["python", "blue"]
    ,["c++", "red"]
    ,["java", "yellow"]
    ,["javascript", "lime"]
    ,["shell", "green"]
    ,["c++", "red"]
];

我想要的是这样的:

{
  python: {
    count: 2
    color: "blue"
  }
  c++: {
    count: 2
    color: "red"
  }
  java: {
    count: 1
    color: "yellow"
  }
  and so on...
}

我试过这样的reduce方法:

let langCount = langArr.reduce((lang, [name, color]) => {
      lang[name] = (lang[name] || 0) + 1;
      lang[color] = 'color';
      return lang;
    }, {});
    console.log(langCount);

但我得到这个输出:

{
  python: 2
  blue: "color"
  c++: 2
  red: "color"
  java: 1
  yellow: "color"
  and so on...
}

每种语言都需要一个对象。

如果lang[name]falsy ,则此方法将对象作为默认值,例如undefined

图案

variable = variable || value;

使用逻辑 OR ||

  • 如果variable有一个值,取这个值,
  • 如果variable有一个值, value代替。

 let langArr = [["python", "blue"], ["python", "blue"], ["c++", "red"], ["java", "yellow"], ["javascript", "lime"], ["shell", "green"], ["c++", "red"]], langCount = langArr.reduce((lang, [name, color]) => { lang[name] = lang[name] || { count: 0, color }; lang[name].count++; return lang; }, {}); console.log(langCount);

你可以使用这个:

array.reduce((acc, current) => {
        if(!acc.hasOwnProperty(current[0])){
            acc[current[0]] = {count: 0, color: current[1]};
        }
        acc[current[0]].count += 1;
        return acc;
    }, {});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM