【问题标题】:Group array by index按索引分组数组
【发布时间】:2015-11-07 03:08:01
【问题描述】:

我有一个数组,看起来像这样:

colors = [
    [356, 11, 30, 1],
    [354, 10, 1, 1],
    [220, 15, 33, 14],
    [51, 4, 69, 31],
    [38, 4, 54, 32],
    [33, 53, 52, 33],
    [19, 28, 78, 34],
    [0, 0, 27, 36]
];

它是一个 HSL 颜色数组,colors[0]colors[1]colors[2] 代表 HSL 值,colors[3] 代表该颜色所属的组。我有 36 组颜色。

我希望能够获得每组中颜色的频率(因此计数color[3])并求和每组的colors[1]

你能帮我设置我的代码吗?我已经尝试为每个组创建一个带有键的对象,以使其更易于使用,但无法...

这是我试图转换数组并使其更容易进行总和和频率计算的代码:

     hueGroups = {};
     for (var i = 0;i<colors.length-1;i++) {
     var group = colors[i][3];
     hueGroups[group] = colors[i];
     }

    And it gives me:
    { '1': [ 354, 10, 1, 1 ],
      '14': [ 220, 15, 33, 14 ],
      '31': [ 51, 4, 69, 31 ],
      '32': [ 38, 4, 54, 32 ],
      '33': [ 33, 53, 52, 33 ],
      '34': [ 19, 28, 78, 34 ] }

我也不想使用外部库,我见过使用 Underscore.js 的解决方案。

【问题讨论】:

标签: javascript arrays grouping


【解决方案1】:

color[][3] 的计数和color[][1] 的总和

colors = [
    [356, 11, 30, 1],
    [354, 10, 1, 1],
    [220, 15, 33, 14],
    [51, 4, 69, 31],
    [38, 4, 54, 32],
    [33, 53, 52, 33],
    [19, 28, 78, 34],
    [0, 0, 27, 36]
];

var histogram = (new Array(37)).fill(0);
var sum_c_1 = 0;

for(var i=0;i<colors.length;i++){
  histogram[colors[i][3]]++;
  sum_c_1 += colors[i][1];
}

console.log("sum = " + sum_c_1 + ", goups = " + histogram.join(","));

适用于更正问题的代码(请参阅下面的 OP 评论):

// starting at 1 to simplify things
var histogram = (new Array(37)).fill(0);
// each individual colore per group as requested
var sum_c_1 = (new Array(37)).fill(0);

for(var i=0;i<colors.length;i++){
  histogram[colors[i][3]]++;
  // just the same as with the histogram
  sum_c_1[colors[i][3]] += colors[i][1];
}

console.log("   sum = " + sum_c_1.join(",") + "\ngroups = " + histogram.join(","));

Object 的转换有点复杂,因为您不应该以数字开头,但不要以数字开头:

hueGroups = {}; 
for (var i = 0;i<colors.length;i++) { 
  var group = colors[i][3];
  hueGroups["hue" + group] = colors[i];
}
console.log(JSON.stringify(hueGroups));

您可以通过简单地向对象添加更多组

var newColor = [12,32,34,13]
hueGroups["hue" + (newColor[3])] = newColor;

要更新直方图和求和,您必须从头重新运行循环或手动更新。

【讨论】:

  • :) 谢谢,直方图,部分。您如何获得每组每种颜色 [1] 的总和? (即第 1 组 = 21 (11+10))另外,我将在上面编辑我的问题。我还试图将我的数组转换为一个对象,每个键是一个组,值是颜色。非常感谢!
  • 您好,谢谢,这正是我想要的总和和频率!对于对象部分,它不像hue1那样工作,该组中有两种颜色,并且没有反映在对象中。但我想我可能刚刚找到了答案:How to add new property with same key name inside declared object?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
相关资源
最近更新 更多