当一个值相同时,对子组进行分组

时间:2015-04-26 01:39:12

标签: javascript arrays json

当数组[i] [0]的值很常见时,我试图将数组中的数据组合在一起。

我可以使用Array.map()来执行此操作吗?

我一直在玩另一个解决方案,即创建一个只包含唯一值的新数组并将其与原始数组进行比较,但我无法找出制作结果的逻辑进入HighCharts想要的东西。

我非常有信心,如果我能弄清楚如何进行这种数组操作,我还可以找出自动化HighCharts的逻辑,这将使我的星期六:)

我有:

var array = [
    ["name1","date1"],
    ["name1","date2"],
    ["name2","date1"],
    ["name2","date1"]
];

想把它变成:

var array = [
    [
        ["name1","date1"],
        ["name1","date2"]
    ],
        ["name2","date1"],
        ["name2","date2"]
    ]
];

3 个答案:

答案 0 :(得分:2)

可能无法在单个循环中执行此操作。我倾向于在第一遍中创建一个对象,然后在一秒钟内构建数据结构。类似的东西:

var obj = oldArray.reduce(function(memo, item) {
  // Get the unique value you're interested in, e.g. "name1"
  var key = item[0];
  // If you've already got it, push this value on the end
  if (memo[key]) {
    memo[key].push(item);
  } else {
    // otherwise, create a new array with this single value
    memo[key] = [ item ];
  }
  // Don't forget to return memo, or you'll have one of those
  // "bang your head against the wall" moments
  return memo;
}, {});

// create a new array and push all the values on
var newArray = [];
for (var k in obj) {
  newArray.push(obj[k]);
}

// or an alternative way to do the same thing
var newArray = Object.keys(obj).reduce(function(memo, k) {
  memo.push(obj[k]);
  return memo;
}, []);

答案 1 :(得分:0)

我可以通过将项目移到命名属性中来完成几个循环。

function returnOrderBy0Position(start)
{
    start.tmp={};
    while (start.length>0)
    {
        var o = start.shift();
        start.tmp[o[0]] = start.tmp[o[0]] ? start.tmp[o[0]] : [];
        start.tmp[o[0]].push(o);
    }

    for (var p in start.tmp)
        start.push(start.tmp[p])

    start.tmp=null;
}

returnOrderBy0Position(array); // call this on your array

答案 2 :(得分:0)

嗯,你不能真正使用地图。你必须聚合(减少)结果。

function regroup(arr) {
    var groups = {};
    return arr.reduce(function (result, item) {
        var key = item[0];
        var group = groups[key];
        if (!group)
            result.push(group = groups[key] = []);
        group.push(item);
        return result;
    }, []);
}