Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.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_Json - Fatal编程技术网

Javascript 从键中提取公共值并生成多维数组

Javascript 从键中提取公共值并生成多维数组,javascript,json,Javascript,Json,我有一个数组对象,如下所示: [ {"k1":"v1","k2":27172}, {"k1":"v1","k2":15177}, {"k1":"v1","k2":19411}, {"k1":"v2","k2":30163}, {"k1":"v2","k2":23949}, {"k1":"v2","k2":23829}, {"k1":"v2","k2":27821} ] 从k1中提取公共值并创建如下多维数组的最简单方法是什么 [ ["v1", [27172, 15177, 19411]], ["

我有一个
数组
对象,如下所示:

[
{"k1":"v1","k2":27172},
{"k1":"v1","k2":15177},
{"k1":"v1","k2":19411},
{"k1":"v2","k2":30163},
{"k1":"v2","k2":23949},
{"k1":"v2","k2":23829},
{"k1":"v2","k2":27821}
]
从k1中提取公共值并创建如下多维数组的最简单方法是什么

[
["v1", [27172, 15177, 19411]],
["v2", [30163, 23949, 23829, 27821]]
];

这是一个带有一些循环的解决方案

我在这里创建了一个jsbin:

输出:

[
   ["v1", [27172, 27172, 15177, 15177, 19411, 19411]], 
   ["v2", [30163, 30163, 23949, 23949, 23829, 23829, 27821, 27821]]
]

这是一个带有一些循环的解决方案

我在这里创建了一个jsbin:

输出:

[
   ["v1", [27172, 27172, 15177, 15177, 19411, 19411]], 
   ["v2", [30163, 30163, 23949, 23949, 23829, 23829, 27821, 27821]]
]

使用数组的
reduce
函数

var test = [
    { "k1": "v1", "k2": 27172 },
    { "k1": "v1", "k2": 15177 },
    { "k1": "v1", "k2": 19411 },
    { "k1": "v2", "k2": 30163 },
    { "k1": "v2", "k2": 23949 },
    { "k1": "v2", "k2": 23829 },
    { "k1": "v2", "k2": 27821 }
]

var out = test.reduce(function(res, obj) {
    res[obj.k1] = res[obj.k1] || [];
    res[obj.k1].push(obj.k2)
    return res;
}, {});

var result = [];
for (var key in out) {
    result.push([key, out[key]])
};

console.log(JSON.stringify(result, null, 2))
将给予

[
 ["v1", [27172, 15177, 19411]],
 ["v2", [30163, 23949, 23829, 27821]]
];

使用数组的
reduce
函数

var test = [
    { "k1": "v1", "k2": 27172 },
    { "k1": "v1", "k2": 15177 },
    { "k1": "v1", "k2": 19411 },
    { "k1": "v2", "k2": 30163 },
    { "k1": "v2", "k2": 23949 },
    { "k1": "v2", "k2": 23829 },
    { "k1": "v2", "k2": 27821 }
]

var out = test.reduce(function(res, obj) {
    res[obj.k1] = res[obj.k1] || [];
    res[obj.k1].push(obj.k2)
    return res;
}, {});

var result = [];
for (var key in out) {
    result.push([key, out[key]])
};

console.log(JSON.stringify(result, null, 2))
将给予

[
 ["v1", [27172, 15177, 19411]],
 ["v2", [30163, 23949, 23829, 27821]]
];
jsfiddle:

解决方案:

function solution(A)
{
    // make an object with an array of values
    var temp = {};
    for (var i=0, ii=A.length; i<ii; i++)
    {
        var prop = A[i]['k1'];
        if (temp[prop])
            temp[prop].push(A[i]['k2']);
        else
            temp[prop] = [A[i]['k2']];
    }

    // reformat that into the 2D array like desired
    var retArr = [];
    for (var key in temp)
        retArr.push([key, temp[key]]);

    // return it!
    return retArr;
}
jsfiddle:

解决方案:

function solution(A)
{
    // make an object with an array of values
    var temp = {};
    for (var i=0, ii=A.length; i<ii; i++)
    {
        var prop = A[i]['k1'];
        if (temp[prop])
            temp[prop].push(A[i]['k2']);
        else
            temp[prop] = [A[i]['k2']];
    }

    // reformat that into the 2D array like desired
    var retArr = [];
    for (var key in temp)
        retArr.push([key, temp[key]]);

    // return it!
    return retArr;
}

您可能希望结合使用
Array.prototype.map()
Object.keys()


您可能希望结合使用
Array.prototype.map()
Object.keys()



假设这只是问题中的一个错误,但似乎
{“k1”,“v1”}
应该是
{“k1”:“v1”}
。如果是这样,请编辑您的问题以更正语法。很抱歉!谢谢你指出!在第一个代码块中,closer需要是
]
,而不是
}
,请详细说明用例?我的意思是键和值之间的关系@BryanGrezeszak对象数组是由软件编写器按原样提供的。假设这只是问题中的一个错误,但似乎
{“k1”,“v1”}
应该是
{“k1”:“v1”}
。如果是这样,请编辑您的问题以更正语法。很抱歉!谢谢你指出!在第一个代码块中,closer需要是
]
,而不是
}
,请详细说明用例?我的意思是键和值之间的关系@BryanGrezeszak对象数组是由软件编写器按原样提供的。只是需要对其进行重塑以使其可视化。输出应该是一个2D数组,第一个值是“k1”或“k2”,因此需要将另一个循环转换为该结构。在您的问题更新后,我在代码中添加了一些更改。不幸的是,如果您查看更新的预期输出,它会完全改变所问的问题。我希望,现在它是你想要的@BryanGrezeszak…好吧,不是我想要的,我不是OP。但是看看OP中的要求,你的结果数据不符合要求的结果数据。很抱歉,他们基本上改变了你的问题。输出应该是一个2D数组,第一个值是“k1”或“k2”,因此,需要将另一个循环转换为该结构。我在您的问题更新后添加了一些代码更改。不幸的是,如果您查看更新的预期输出,它将完全更改所问的问题。我希望,现在它是您想要的@BryanGrezeszak…好吧,不是我想要的,我不是OP。但请查看OP中的需求,您的结果数据不符合要求的结果数据。很抱歉,他们基本上改变了你的问题。除了for(var-key-in-out){result.push([key,out[key]]);}结尾的额外“)”;,这个方法很神奇。谢谢你的发帖!感谢@peterlegerfor(var-key-in-out){result.push([key,out[key]]);}结尾处的@peterleger“;”;,这个方法很神奇。谢谢你的发帖!谢谢@PeterLeger