2016-04-07 2 views
0

извините, я новичок в javascript. Может кто-нибудь объяснить мне, как изменить этот объектИзмените объект на новый массив в Javascript

{toto:[12,13,15],titi:[45,12,34]} 

к массиву

newArray = [ 
{ 
    toto:12, 
    titi:45 
},{ 
    toto:13, 
    titi:12 
},{ 
    toto:15, 
    titi:34} 
] 

Кроме того, что решение, если тото и Тити не имеет ту же длину Спасибо за поддержку!

+0

Решение переменной длины должно не допускать его. Заполните отверстия, прежде чем пытаться их комбинировать. – Malk

ответ

1

Вот как я это сделал. Таким образом, вам не нужно знать имена ключей или размер массива, но для этого требуется несколько циклов.

obj = {toto:[12,13,15],titi:[45,12,34]}; 
newArray = []; 

// Find the longest array in your data set 
longest = 0; 
Object.keys(obj).forEach(function(key) { 
    if (obj[key].length > longest) { 
    longest = obj[key].length; 
    } 
}); 

// Loop through the existing data set to create new objects 
for (i = 0; i<longest; i++) { 
    newObject = {}; 
    Object.keys(obj).forEach(function(key) { 
    newObject[key] = obj[key][i]; 
    }); 
    newArray.push(newObject); 
} 

console.log(newArray); 

plnkr.co demo в файле script.js.

Если вы хотите игнорировать ключи, которые будут иметь undefined значения для неровных контуров, вы можете добавить условное внутри forEach цикла, который создает новый объект:

Object.keys(obj).forEach(function(key) { 
    if (obj[key][i] !== undefined) { 
     newObject[key] = obj[key][i]; 
    } 
    }); 
+0

отлично !!!! большое спасибо – llaid

1

Предполагая, что длина toto и titi одинаковы:

Obj = {toto:[12,13,15],titi:[45,12,34]}; 
newArray = []; 
for (var k in Obj["toto"]) { 
    newArray.push({ toto:Obj["toto"][k],titi:Obj["titi"][k] }); 
} 
1

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

// Your input 
var input = {toto:[12,13,15],titi:[45,12,34]}; 
// An array to store your output 
var output = []; 

// Since your inner arrays are of equal size, you can loop through them 
// as follows 
for(var i = 0; i < input.toto.length; i++){ 
    output.push({ toto: input.toto[i], titi: input.titi[i]}); 
} 

Вы можете увидеть working example of this here и то, что output массив выглядит следующим образом:

enter image description here

1

более общий подход

var object = { toto: [12, 13, 15], titi: [45, 12, 34] }, 
 
    newArray = function (o) { 
 
     var keys = Object.keys(o), 
 
      l = keys.reduce(function (r, a) { return Math.max(r, o[a].length); }, 0), 
 
      i = 0, 
 
      t, 
 
      result = []; 
 

 
     while (i < l) { 
 
      t = {}; 
 
      keys.forEach(function (k) { t[k] = o[k][i]; }); 
 
      result.push(t); 
 
      i++; 
 
     } 
 
     return result; 
 
    }(object); 
 

 
document.write('<pre>' + JSON.stringify(newArray, 0, 4) + '</pre>');

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