2015-10-23 2 views
0

превратить массив 2 в объект массива?

var a = [ 'Child' , 'Adult']; 
 
var b = [2,6]; 
 
var c = {} 
 

 
for(var i=0; i<a.length; i++){ 
 
       c[a[i]] = b[i] 
 
      } 
 

 
document.getElementById('result').innerHTML = JSON.stringify(c, 0, 4);
<pre id="result"></pre>

Над контуром производства

{ 
    "Child": 2, 
    "Adult": 6 
} 

, но как производить resutl как этот

[{"child":2},{"Adult":6}] 

, который впоследствии легко для меня, чтобы перебрать.

+0

@Alicia если ОП попросил ' [{«child»: 2}, {«Adult»: 6}] 'это не ** действительное редактирование **, чтобы улучшить ожидаемый формат результата, например,« {»type»: «child», «pax»: 2} ', если явно не запрошено OP. –

+0

ОП запросил этот вывод, в котором говорилось, что было бы легко прокручиваться, что явно ложно. Прохождение через новую структуру потребует большего количества кода, чем оригинал, и требует забавных вещей, таких как использование Object.keys для извлечения имен «Child» и «Adult», вызываемых объектом с одним свойством. – James

+0

@James: но представьте, что если 'a' были чем-то вроде' ['Child', 'Child', 'Adult'] ', простой плоский объект мог бы обрабатывать только уникальный массив, а in-in может обрабатывать вложенная итерация. – dandavis

ответ

2
var a = [ 'Child' , 'Adult']; 
var b = [2,6]; 
var c = [] 

for(var i=0; i<a.length; i++){ 
       var o = {} 
       o[a[i]] = b[i]; 
       c.push(o) 
      } 

если вы используете функциональную библиотеку как Ramda, то вы можете сделать: -

R.zipWith(R.createMapEntry,a,b); 
+0

awsome. это пятно –

0

Вы устанавливаете var c как объект, но ожидаете, что он будет массивом. Попробуйте:

var a = [ 'Child' , 'Adult']; 
var b = [2,6]; 
var c = [] 

for(var i=0; i<a.length; i++){ 

    var temp = {}; 
    temp[a[i]] = b[i]; 

    c.push(temp); 
} 
+0

Извините. Используется для синтаксиса PHP. Отредактировано и протестировано. – Chris

0

Что-то, как это должно делать.

var a = [ 'Child' , 'Adult']; 
var b = [2,6]; 
var c = []; 

for(var i=0; i<a.length; i++){ 
    var obj = {}; // create a temp object 
    obj[a[i]] = b[i]; // fill the values 
    c.push(obj); // push it to c 
} 
0

var a = [ 'Child' , 'Adult']; 
 
var b = [2,6]; 
 
var c = []; 
 

 
for(var i=0; i<a.length; i++){ 
 
       c[i] = {}; 
 
       c[i][a[i]] = b[i]; 
 
      } 
 

 
document.getElementById('result').innerHTML = JSON.stringify(c, 0, 4);
<pre id="result"></pre>

0

Попробуйте использовать Array.prototype.map(), перемещаясь c в функции обратного вызова, чтобы создать объект для каждого элемента в a

var a = ["Child", "Adult"]; 
 
var b = [2, 6]; 
 

 
var arr = a.map(function(val,key) { 
 
    var c = {}; 
 
    c[val] = b[key]; 
 
    return c 
 
}); 
 

 

 

 
document.getElementById('result').innerHTML = JSON.stringify(arr, 0, 4);
<pre id="result"></pre>

1

Простой и процедурный.

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

var a = ['Child', 'Adult']; 
 
var b = [2,6]; 
 
var c = []; 
 

 
for (var i = 0 ; i < a.length ; i++) { 
 
    var key = a[i]; 
 
    var val = b[i]; 
 
    var obj = {}; 
 
    obj[key] = val; 
 
    c[i] = obj; 
 
} 
 

 
document.getElementById('result').innerHTML = JSON.stringify(c, 0, 4);
<pre id="result"></pre>

Более функциональная с картой.

Как уже упоминалось в других ответах: существуют более функциональные программные ориентиры. Вышеприведенный код настолько прост, насколько это возможно, чтобы помочь вам учиться.

Вы также могли бы сделать что-то вроде:

var a = ['Child', 'Adult']; 
 
var b = [2,6]; 
 

 
c = a.map(function(key,i) { 
 
    var obj = {}; 
 
    obj[key] = b[i]; 
 
    return obj; 
 
}); 
 

 
document.getElementById('result').innerHTML = JSON.stringify(c, 0, 4);
<pre id="result"></pre>

Учитывая у вас есть доступ к массив б с индексом в любом случае я бы не сказал, этот способ лучше.

Еще более функциональный с почтовым индексом и картой.

Более функциональный способ состоял бы в объединении a и b с использованием zip-функции, а затем для сопоставления с новым массивом.

var a = ['Child', 'Adult']; 
 
var b = [2,6]; 
 

 
function zip(arrays) { 
 
    return arrays[0].map(function(_,i){ 
 
    return arrays.map(function(array){return array[i]}) 
 
    }); 
 
} 
 

 
var c = zip([a,b]).map(function(obj) { 
 
    var result = {}; 
 
    result[obj[0]] = obj[1]; 
 
    return result; 
 
}); 
 

 
document.getElementById('result').innerHTML = JSON.stringify(c, 0, 4);
<pre id="result"></pre>

0

в Firefox (и ES6 или хромом с экспериментальными JS флагом о: набор флагов), вы можете сделать это аккуратный маленький трюк:

var a = [ 'Child' , 'Adult']; 
var b = [2,6]; 

a.map( (a,i)=> a={[a]: b[i]} ); // == [{"Child":2},{"Adult":6}] 

(печально a= часть необходима, чтобы сделать ее не похожей на функциональное тело, но она безвредна ...

если вы не против d estroying массива, это немного чище чтение:

a.map(a => a={[a]: b.shift()}); 

Я думаю, что это в чистом виде, чем простая ваниль может сделать эту задачу с меньшим количеством символов коды, чем-то вроде Ramda ...

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