2017-02-20 22 views
2

, что это лучший способ преобразовать объект массивов в массив объектов и наоборотлучший способ для преобразования объекта с массивами в массив с объектами и наоборот

{ 
    category : ['a','b','c'], 
    title : ['e','f','g'], 
    code : ['z','x','v'] 
} 

Для

[ 
    { 
    category : 'a', 
    title : 'e', 
    code : 'z' 
    }, 
    { 
    category : 'b', 
    title : 'f', 
    code : 'x' 
    }, 
    { 
    category : 'c', 
    title : 'g', 
    code : 'v' 
    }, 
] 
+0

'Object.keys()' + 'Array.reduce()' – Shilly

+0

@amir, это работает для вас? –

+0

@ Alexandru-IonutMihai yep Спасибо :) –

ответ

2

Вы можете использовать две функции для создания массива или объекта. Они работают с

  • Object.keys для получения всех собственных имен свойств,

  • Array#reduce для перебора массива и собирая предметы для возвращения,

  • Array#forEach просто Ф.О. itarating массива.

function getArray(object) { 
 
    return Object.keys(object).reduce(function (r, k) { 
 
     object[k].forEach(function (a, i) { 
 
      r[i] = r[i] || {}; 
 
      r[i][k] = a; 
 
     }); 
 
     return r; 
 
    }, []); 
 
} 
 

 
function getObject(array) { 
 
    return array.reduce(function (r, o, i) { 
 
     Object.keys(o).forEach(function (k) { 
 
      r[k] = r[k] || []; 
 
      r[k][i] = o[k]; 
 
     }); 
 
     return r; 
 
    }, {}); 
 
} 
 

 
var data = { category: ['a', 'b', 'c'], title: ['e', 'f', 'g'], code: ['z', 'x', 'v'] }; 
 

 
console.log(getArray(data)); 
 
console.log(getObject(getArray(data)));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Деиствительно удивительный –

1

Вот решение, использующее метод reduce и функцию arrow.

var obj={ 
 
    category : ['a','b','c'], 
 
    title : ['e','f','g'], 
 
    code : ['z','x','v'] 
 
} 
 
var result=obj[Object.keys(obj)[0]].reduce((a,b,i)=>{ 
 
    var newObj={}; 
 
    Object.keys(obj).forEach(function(item){ 
 
    newObj[item]=obj[item][i]; 
 
    }); 
 
    return a.concat(newObj); 
 
},[]); 
 
console.log(result);

1

Вы можете использовать map() и forEach()

var obj = { 
 
    category : ['a','b','c'], 
 
    title : ['e','f','g'], 
 
    code : ['z','x','v'] 
 
} 
 

 
var result = Object.keys(obj).map(function(e, i) { 
 
    var o = {} 
 
    Object.keys(obj).forEach((a, j) => o[a] = obj[a][i]) 
 
    return o 
 
}) 
 

 
console.log(result)