【问题标题】:Javascript - Convert one Array into two after Group-by in [duplicate]Javascript - 在 [重复] 中分组后将一个数组转换为两个
【发布时间】:2019-10-18 22:09:02
【问题描述】:

我有如下数组

myArray = ["foo", "bar", "foo", "bar", "bar", "bar", "zoom"]

我想要这样的输出

nameArray = ["foo", "bar", "zoom"] 

qtyArray = [2, 4, 1]

我将使用生成的两个数组中的 Plotly 来绘制条形图。

TIA

【问题讨论】:

标签: javascript arrays group-by


【解决方案1】:

您可以使用Map 并获取键和值。

var array = ["foo", "bar", "foo", "bar", "bar", "bar", "zoom"],
    map = array.reduce((m, v) => m.set(v, (m.get(v) || 0) + 1), new Map),
    values = [...map.keys()],
    counts = [...map.values()];

console.log(...values);
console.log(...counts);

【讨论】:

    【解决方案2】:

    你可以使用reduce函数。在回调中检查累加器对象是否具有名称为 foo 或 bar 或 zoom 的键。如果它在那里,则将计数增加 1,否则按该名称创建一个键并将 1 作为值。然后你可以使用Object.keys 创建一个键数组,foo,bar & zoom & Object.values 得到一个计数数组

    let myArray = ["foo", "bar", "foo", "bar", "bar", "bar", "zoom"];
    
    let newData = myArray.reduce(function(acc, curr) {
      if (acc[curr]) {
        acc[curr] += 1;
      } else {
        acc[curr] = 1;
    
      }
      return acc;
    }, {});
    
    let nameArray = Object.keys(newData);
    let qtyArray = Object.values(newData);
    console.log(nameArray, qtyArray)

    【讨论】:

    • 仅供参考:如果数组有 integer-like 项,Object.keys() 的顺序将会改变。
    【解决方案3】:
    var myArray = ["foo", "bar", "foo", "bar", "bar", "bar", "zoom"]; 
    var arr = {}
    myArray.map(function(x){
      if(typeof(arr[x])=="undefined") {arr[x] =0;}
      arr[x]++;
    })
    
    var arr1 = Object.keys(arr);
    arr2 = arr1.map(x=>arr[x])
    
    
    /* arr1
    foo,bar,zoom
    */
    
    /* arr2
    2,4,1
    */
    

    【讨论】:

      猜你喜欢
      • 2014-05-20
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      相关资源
      最近更新 更多