2016-03-18 2 views
2

Мне нужно преобразовать массив или массив массивов в объект с ключами, названными из массива имен. Пример:преобразовать массив в объект с помощью lodash

//given names 
    names = ['first', 'second', 'third', 'fourth'] 
//array 
    param = [1, 2, 3, 4] 
//becomes 
    result = {first: 1, second: 2, third: 3, fourth: 4} 

//array of arrays 
    param = [ 
     [1, 2, 3, 4], 
     [-4, 3, 1, 32], 
    ] 
//becomes 
    result = [ 
     {first: 1, second: 2, third: 3, fourth: 4}, 
     {first: -4, second: 3, third: 1, fourth: 32}, 
    ] 

Мое текущее решение заключается в следующем:

var names = ['first', 'second', 'third', 'forth']; 

    function arrayToObject(array, names) { 
     var result = {}; 
     for (var i = 0; i < array.length; i++) { 
     if (typeof array[i] === 'object') { 
      result[i] = arrayToObject(array[i], names); 
      continue; 
     } 
     result[names[i]] = array[i]; 
     } 
     return result; 
    } 

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

+0

вы несовпадение копии и результата. копия не объявлена. –

+0

Исправлено, забыл переименовать его – Klemensas

+0

, тогда все в порядке. вы объявляете результат как объект. write if statement: result = [] if array, result = {} if hash –

ответ

4

Vanilla JS: Функция, которая создает объект из массива:

function toObj(arr) { 
    return arr.reduce(function(p, c, i) { 
    p[names[i]] = c; 
    return p; 
    }, {}); 
} 

Используется с map:

var out = arr.map(toObj); 

DEMO

+0

Умный, я не думал использовать карту вместе с уменьшением – Klemensas

3

Вы можете использовать _.zipObject() застегивать два массива в объект. Вы по существу сопоставляете CSV-данные с заголовками с объектами JavaScript.

Вы можете попытаться найти JavaScript CSV-преобразователи. Вы можете найти интересные результаты.

// Given names 
 
var names = [ 'first', 'second', 'third', 'fourth' ]; 
 
// Array 
 
var param = [ 1, 2, 3, 4 ]; 
 
// Becomes 
 
var result = _.zipObject(names, param); 
 

 
document.body.innerHTML = JSON.stringify(result, null, 2); 
 

 
// Array of arrays 
 
var param = [ 
 
    [ 1, 2, 3, 4 ], 
 
    [ -4, 3, 1, 32 ], 
 
]; 
 
// Becomes 
 
var result = _.chain(param).map(function(p) { 
 
\t return _.zipObject(names, p) 
 
}).value(); 
 

 
document.body.innerHTML += '\n\n' + JSON.stringify(result, null, 2);
body { 
 
    font-family: monospace; 
 
    white-space: pre; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.min.js"></script>

+0

Я посмотрю в CSV-конвертеры, спасибо :). Хотя, хотя это действительно решение в lodash, я пойду с решением Andys из-за того, что он такой же лаконичный, как ваш, и, самое главное, ваниль. – Klemensas

+0

Ну, я бы тоже использовал сокращение, поскольку это тривиально, но вы попросили решение lodash ... –

Смежные вопросы