【问题标题】:JavaScript: Reduce an array to nested objectsJavaScript:将数组简化为嵌套对象
【发布时间】:2020-06-21 12:40:12
【问题描述】:

所以假设我的数组如下所示:

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...
}

【问题讨论】:

  • 您尝试修改.reduce() sn-p 以使其产生您期望的输出?
  • 您缺少子对象的创建,以及 reduce 代码中的一种间接方式。最值得注意的是,count 这个词永远不会出现在您的代码中,这应该使主要问题显而易见 - 如果您有地方放置它,您(可能)会拥有所需的结构。
  • @Andreas 那是我试过的,我不知道如何将它们放入单独的对象中
  • 如果一种语言有不同的颜色会发生什么?
  • 但是你知道如何使用解构吗?

标签: javascript arrays object ecmascript-6 reduce


【解决方案1】:

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

如果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);

【讨论】:

  • 这只是另一个“分组依据”答案(有点扭曲,它不是一个包含所有选项的数组,而是一个用于计数的数字)。现在这已经足够一个新的答案而不是重复投票了吗?
  • 非常感谢!你能解释一下这条线的作用吗lang[name] = lang[name] || { count: 0, color };
【解决方案2】:

你可以用这个:

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

【讨论】:

    猜你喜欢
    • 2019-08-25
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2018-01-24
    • 2020-05-03
    • 2019-02-23
    相关资源
    最近更新 更多