Javascript:如何使用已排序的唯一数组将对象数组转换为对象?

有这种结构的数据:

$input = [ { animal: 'cat', name: 'Rocky', value: 1 },
           { animal: 'cat', name: 'Spot',  value: 2 },
           { animal: 'dog', name: 'Spot',  value: 3 } ];

需要尽可能快的方法来转换为这种格式:

$output = { animal: [ 'cat', 'dog' ],
            name: [ 'Rocky', 'Spot' ],
            value: [ 1, 2, 3 ] };

输出应具有与输入中每个对象中的每个键相等的键.并且输出值应该是具有已排序的唯一值的数组.我发现了一些使用嵌套循环的方法,但比我想要的慢.输入数组有30,000个元素,每个对象有8个键,我能做的最好的是Chrome中的300ms.想要降到100毫秒.有没有更快的方法使用地图或减少?

最佳答案
这是一种方式.

$input = [ { animal: 'cat', name: 'Rocky', value: 1 },
           { animal: 'cat', name: 'Spot',  value: 2 },
           { animal: 'dog', name: 'Spot',  value: 3 } ];

$output = {animal:{},name:{},value:{}};

$input.forEach(function(v,i) { 
    $output.animal[v.animal] = 1;
    $output.name[v.name] = 1;
    $output.value[v.value] = 1;
});

$output.animal = Object.keys($output.animal);
$output.name = Object.keys($output.name);
$output.value = Object.keys($output.value);

它可以防止每次都必须测试每个阵列.您可以进行性能比较,看看它是否有帮助.

实例:http://jsfiddle.net/TJVtj/1/

如果您不想对密钥进行硬编码,则可以使解决方案通用.

var keys = Object.keys($input[0]),
    $output = {};

keys.forEach(function(v) {
    $output[v] = {};
});

$input.forEach(function(v) {
    keys.forEach(function(vv) {
        $output[vv][v[vv]] = 1;
    });
});

keys.forEach(function(v) {
    $output[v] = Object.keys($output[v]);
});

实例:http://jsfiddle.net/TJVtj/2/

警告.所有值都是字符串,因为它们被提取为对象键.

转载注明原文:Javascript:如何使用已排序的唯一数组将对象数组转换为对象? - 代码日志