Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当一个值相同时分组子阵列_Javascript_Arrays_Json - Fatal编程技术网

Javascript 当一个值相同时分组子阵列

Javascript 当一个值相同时分组子阵列,javascript,arrays,json,Javascript,Arrays,Json,当数组[I][0]处的值为公共值时,我尝试将数组中的数据分组在一起 我可以使用Array.map()来执行此操作吗 我一直在尝试另一种解决方案,即创建一个仅具有唯一值的新数组,并将其与原始数组进行比较,但我无法找出将结果生成HighCharts想要的结果的逻辑 我非常有信心,如果我能弄清楚如何进行这种数组操作,我也能弄清楚自动生成HighCharts的逻辑,这将使我的星期六:) 我有: var array = [ ["name1","date1"], ["name1","date

当数组[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"]
    ]
];

在一个循环中可能不可能做到这一点。我倾向于在第一个过程中创建一个对象,然后在第二个过程中构建数据结构。比如:

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;
}, []);

我可以通过几个循环将项目删除到命名属性中来完成这项工作

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

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

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;
    }, []);
}

它可以在一个循环中完成,但我认为它的效率比这里的要低(因为在运行过程中构建数组需要重复搜索输出数组,效率比寻址对象属性要低),这对我来说很有效-谢谢!)我还有另一个相关问题--