2014-11-12 4 views
1

У меня есть массив объектов, который выглядит следующим образом:создать массив значений с одинаковым ключом из массива объектов

[ 
    { 
     key1: val_1.a 
     key2: val_2.a 
     key3: val_3.a 
    },{ 
     key1: val_1.b 
     key2: val_2.b 
     key3: val_3.b 
    },{ 
     key1: val_1.c 
     key2: val_2.c 
     key3: val_3.c 
    } 
] 

Я хочу использовать этот объект, чтобы создать еще один объект, который выглядит следующим образом:

{ 
    key1: [val_1.a, val_1.b, val_1.c] 
    key2: [val_2.a, val_2.b, val_2.c] 
    key3: [[val_3.a, val_3.b, val_3.c] 
} 

Поскольку ключи одинаковы для каждого объекта, я просто хочу сохранить в массиве все значения, соответствующие каждой клавише.

Пожалуйста, если есть кто-то, кто должен был сделать это раньше и мог бы поделиться кодом, было бы здорово. Заранее спасибо.

ответ

3

Вы можете сделать это так, как это будет работать во всех браузерах, и даже будет работать, если у всех объектов нет одинакового набора ключей (например, он просто накапливает данные для любых ключей):

function combineKeyData(data) { 
    var output = {}, item; 
    // iterate the outer array to look at each item in that array 
    for (var i = 0; i < data.length; i++) { 
     item = data[i]; 
     // iterate each key on the object 
     for (var prop in item) { 
      if (item.hasOwnProperty(prop)) { 
       // if this keys doesn't exist in the output object, add it 
       if (!(prop in output)) { 
        output[prop] = []; 
       } 
       // add data onto the end of the key's array 
       output[prop].push(item[prop]); 
      } 
     } 
    } 
    return output; 
} 

Рабочая jsFiddle: http://jsfiddle.net/jfriend00/0jjquju9/

Объяснение:

  1. Для каждого элемента массива
  2. Для каждого ключа в элементе в массиве
  3. Добавить ключ как пустой массив в выходной объект, если он еще не существует
  4. Добавить данные в конец массива для этого ключа в выходном объекте
  5. возвращает результирующий новый объект
0
result = {}; 
for (var i = 0; i < array.length; i++) { 
    var obj = array[i]; 
    for (var key in obj) { 
     if (obj.hasOwnProperty(key)) { 
      if (result[key]) { 
       result[key].push(obj[key]); 
      } else { 
       retult[key] = [obj[key]]; 
      } 
     } 
    } 
} 
1

var arr = [ 
 
{ 
 
    key1: 'val_1.a', 
 
    key2: 'val_2.a', 
 
    key3: 'val_3.a' 
 
},{ 
 
    key1: 'val_1.b', 
 
    key2: 'val_2.b', 
 
    key3: 'val_3.b' 
 
},{ 
 
    key1: 'val_1.c', 
 
    key2: 'val_2.c', 
 
    key3: 'val_3.c' 
 
} 
 
] 
 

 
var result = arr.reduce(function(obj, current) { //Reduce the array to an object 
 
    Object.keys(current).forEach(function(key) { //Each key 
 
     obj[key] = obj[key] || []; //Has to be an array if not exists 
 
     obj[key] = Array.isArray(obj[key]) ? obj[key] : [obj[key]]; //Has to be an array if not an array 
 
     obj[key].push(current[key]); //Add current item to array of matching key 
 
    }); 
 
    return obj; //Continue to the next object in the array 
 
}); 
 

 
console.log(result);

вышеуказанные функции: Array#reduce, Array#forEach, Array.isArray, Object.keys являются частью спецификации ECMAScript 5, в результате чего они не доступны в IE8 и ниже.

+1

Это возвращает 2-мерный массив, он хочет объект, содержащий массивы. – Barmar

+0

@ Barmar исправлено. –

+0

Это также предполагает, что все объекты в исходном массиве имеют точно такой же набор ключей - не более того. Это ярлык, который справедлив для точных данных OP, но не является самым безопасным способом построения структуры выходных данных. – jfriend00

0
let R = require('ramda'); 
let arr =[ 
    { 
    'key1': 'a', 
    'key2': 'b', 
    'key3': 'c', 
    },{ 
    'key1': 'a1', 
    'key2': 'b1', 
    'key3': 'c1', 
    },{ 
    'key1': 'a2', 
    'key2': 'b2', 
    'key3': 'c2', 
    } 
]; 

let key1 = R.pluck('key1', arr); 
let key2 = R.pluck('key2', arr); 
let key3 = R.pluck('key3', arr); 
let obj = { 
    key1, 
    key2, 
    key3 
}; 

Obj = { key1: [ 'a', 'a1', 'a2' ], key2: [ 'b', 'b1', 'b2' ], key3: [ 'c', 'c1', 'c2' ] } 
+1

Возможно, вы могли бы объяснить предлагаемое решение, а не просто отправить какой-то код? - Найдено в [обзор] (http://stackoverflow.com/review/late-answers/13432972). –