简体   繁体   English

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

[英]JavaScript: Reduce an array to nested objects

So suppose my array looks like this:所以假设我的数组看起来像这样:

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

what I want is something like this:我想要的是这样的:

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

I tried reduce method like this:我试过这样的reduce方法:

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

but I get this output:但我得到这个输出:

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

You need an object for each language.每种语言都需要一个对象。

This approach takes an object as default value if lang[name] is falsy , like undefined .如果lang[name]falsy ,则此方法将对象作为默认值,例如undefined

The pattern图案

variable = variable || value;

works with a logical OR ||使用逻辑 OR || :

  • if variable has a truthy value, take this value,如果variable有一个值,取这个值,
  • if variable has a falsy value, take value instead.如果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);

You can use this:你可以使用这个:

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