【问题标题】:Group array values and add properties对数组值进行分组并添加属性
【发布时间】:2020-10-02 02:29:39
【问题描述】:

有谁知道通过对象键对对象数组进行分组的方法?例如,我有许多汽车对象:

const cars = [
  "fiat-palio", 
  "fiat-stilo", 
  "fiat-strada", 
  "fiat-uno", 
  "fiat-uno", 
  "gm-corsa", 
  "gm-celta", 
  "ford-fiesta", 
  "volkswagen-gol", 
  "volkswagen-gol", 
  "volkswagen-gol", 
  "volkswagen-voyage"
]

我想创建一个新的汽车对象数组,按每个汽车制造商分组:

{ 
  "fiat": { 
    "palio": 1, 
    "stilo": 1, 
    "strada": 1, 
    "uno": 2 
  }, 
  "gm": { 
    "corsa": 1, 
    "celta": 1 
  }, 
  "ford": { 
    "fiesta": 1 
  }, 
  "volkswagen": { 
    "gol": 3, 
    "voyage": 1 
  }
}

【问题讨论】:

  • 你尝试过什么来达到你想要的结果?

标签: javascript arrays object grouping


【解决方案1】:

您可以拆分每辆汽车并破坏阵列以获取品牌和型号。确定这些值后,只需将这些值分散到 reducer 中即可。

const cars = [
  "fiat-palio", "fiat-stilo", "fiat-strada", "fiat-uno", "fiat-uno", 
  "gm-corsa",  "gm-celta", 
  "ford-fiesta", 
  "volkswagen-gol", "volkswagen-gol", "volkswagen-gol", "volkswagen-voyage"
];

const frequency = cars.reduce((groups, car) => ({
  ...groups,
  ...(([make, model]) => ({
    [make] : {
      ...groups?.[make],
      [model] : (groups?.[make]?.[model] || 0) + 1
    }
  }))(car.split('-'))
}), {});

console.log(frequency);
.as-console-wrapper { top: 0; max-height: 100% !important; }

代码高尔夫乐趣

f=l=>l.reduce((g,c)=>({...g,...(([m,n])=>({[m]:{...g?.[m],[n]:(g?.[m]?.[n]||0)+1}}))(c.split('-'))}),{})(104 字节)

用法:只需将cars 传递给上面的f 函数即可。

【讨论】:

    【解决方案2】:

    您可以使用数组的reduce方法来产生所需的输出。

    reduce 在每次迭代中获取数组先前和当前项并返回标量值。 here the documentation

    const cars = [
      "fiat-palio", 
      "fiat-stilo", 
      "fiat-strada", 
      "fiat-uno", 
      "fiat-uno", 
      "gm-corsa", 
      "gm-celta", 
      "ford-fiesta", 
      "volkswagen-gol", 
      "volkswagen-gol", 
      "volkswagen-gol", 
      "volkswagen-voyage"
    ];
    
    let result = cars.reduce((obj, item) => {
      let pair = item.split('-'); // split key and value
      let mark = pair[0]; 
      let model = pair[1];
    
      if(!obj.hasOwnProperty(mark)) { // initialize new mark and model
         obj[mark] = {};
         obj[mark][model] = 1;
      } else {
        if(obj[mark].hasOwnProperty(model)) { // increment existing model 
          obj[mark][model] += 1; 
        } else { // initialize model of existing mark
           obj[mark][model] = 1;
        }
      }
    
      return obj;
    }, {}) 
    
    
    console.log(result)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-10
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 2022-03-17
      • 1970-01-01
      • 2015-12-31
      • 2021-11-25
      相关资源
      最近更新 更多