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;

适用于 logical OR ||:

  • 如果variable有一个truthy值,取这个值,
  • 如果 variable 有一个 falsy 值,取 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;
    }, {});