对数组值进行分组并添加属性

Group array values and add properties

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

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

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

reduce 在每次迭代中采用数组先前和当前项目以及 returns 标量值。 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)

您可以拆分每辆车并破坏数组以获取品牌和型号。确定这些值后,只需将这些值分布在一个 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函数即可。