2016-02-26 2 views
0

Я пытаюсь создать массив, как этот:Создать массив смешанных объектов в Javascript

["Apple",{1: "Pie", 2: "Dumpling", 3: "Cider"}, "Banana", {1: "Bread", 2: "Republic"}] 

начиная с массива просто:

["Apple", "Banana"] 

// <input id="Apple"... data-makes="Pie,Dumpling,Cider"> 
// <input id="Banana" ... data-makes="Bread,Republic" 

var output = []; 
var fruits = ["Apple", "Banana"]; 
for (i=0; i < fruits.length; ++i) 
{ 
    members = document.getElementById(fruits[i]).getAttribute("data-makes"); 
    tmp = members.split(","); 
    for (k=0; k < tmp.length; ++k) 
    { 
    output[i][k+1] = tmp[k]; 
    } 
} 

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

+0

Вы можете добавить HTML для элементов с 'данных makes' – Andy

+1

@Andy также желаемая массив 1-D, но OP создает 2D array 'output [i] [k + 1] = tmp [k];' – Ramanlfc

+0

Не должен ли результат быть более подобным: ["Apple", ["Pie", "Dumpling", "Cider"], "Banana », [« Хлеб »,« Республика »]] –

ответ

2

Вы можете попробовать что-то вроде этого. Вам придется заменить жестко закодированные элементы ...

var fruits = ["Apple", "Banana"]; 
 
var tempString = "Pie,Dumpling,Cider"; 
 
var tempArray = new Array(); 
 
tempArray.push(tempString); 
 
tempString = "Bread,Republic"; 
 
tempArray.push(tempString); 
 
var output = {}; 
 
for (var i = 0; i < fruits.length; i++) 
 
{ 
 
    var members = tempArray[i].split(","); 
 
    var temp = {}; 
 
    for(var k = 0; k < members.length; k++) 
 
    { 
 
     temp[("" + k)] = members[k]; 
 
    } 
 
    output[("" + fruits[i])] = temp; 
 
} 
 
console.log(output); 
 
//Different ways to access the objects 
 
console.log(output.Apple); 
 
console.log(output["Apple"]); 
 
console.log(output.Banana[0]); 
 
console.log(output["Banana"]["0"]);

enter image description here

+1

Ура! Пользователь Chrome Developer Tools! ;) –

+0

Выглядит хорошо. Я бы никогда не понял этот синтаксис сам по себе. Ваш пример выводится точно так же, как мой ручной объект данных делает в консоли! Я закодирую свой фактический код, как это, а затем вернусь и отметьте это правильно. Благодаря! – user1601513

+0

@ пользователь1601513 добро пожаловать! Рад, что смог помочь! – brso05

1

попробовать это:

var fruits = ["Apple", "Banana"], i, k, members, tmp, output = []; 
    var final = []; 
    for (i=0; i < fruits.length; ++i) 
    { 
     members = document.getElementById(fruits[i]).getAttribute("data-makes"); 
     tmp = members.split(","); 
     output[i] = new Object(); 
     for (k=0; k < tmp.length; ++k) 
     { 
     output[i][k+1] = tmp[k]; 
     } 
     final.push(fruits[i]) 
     final.push(output[i]) 
    } 
    console.log(final); 
1

Во-первых, помните, что ключи JSON всегда Струны - не целые числа.

["Apple", "Banana"] 

// data-makes="Pie,Dumpling,Cider", data-makes="Bread,Republic" 
var output = []; 
var type; 
var fruits = ["Apple", "Banana"]; 
for (i=0; i < fruits.length; ++i) 
{ 
    members = document.getElementById(fruits[i]).getAttribute("data-makes"); 
    tmp = members.split(","); 
    for (k=0; k < tmp.length; ++k) 
    { 
    type = {} 
    type[fruits[i]] = {} 
    type[fruits[i]][k] = tmp[k] 
    output.push(type); 
    } 
} 

Это выведет:

[ 
{ "apple" : { 
       "1" : "pie", 
       "2" : "Dumpling", 
       "3" : "Cider" 
      } 
    }, 
    { "banana" : { 
       "1" : "Bread", 
       "2" : "Republic" 
      } 
] 

Не совсем то, что вы спросили (я не могу представить себе использование массива в 1-D для этого, но вы можете получить точку)

1

У вас еще две проблемы с кодом:

Во-первых, вы никогда не ставите fruits[i] в массив output.

Во-вторых, вы не можете назначить output[i][k+1], пока вы не инициализируете output[i] как массив или объект.

for (i=0; i < fruits.length; ++i) 
{ 
    output.push(fruits[i]); 
    var members = document.getElementById(fruits[i]).getAttribute("data-makes"); 
    var tmp = members.split(","); 
    var obj = {}; 
    for (k=0; k < tmp.length; ++k) 
    { 
    obj[k+1] = tmp[k]; 
    } 
    output.push(obj); 
} 
2

Альтернативный способ, который может оказаться полезным в будущем.

// loop over the fruits 
var arr = fruits.reduce(function (fp, fc) { 

    // get the string (in your example the data-makes value) 
    // and add each to a new object 
    var temp = makes[fc].split(', ').reduce(function (p, c, i) { 
    p[i + 1] = c; 
    return p; 
    }, {}); 

    // then concatenate the fruit name and its object to 
    // the output array 
    return fp.concat.apply(fp, [fc, temp]); 
}, []); 

ВЫВОД

[ 
    "Apple", { "1": "pie", "2": "dumpling", "3": "cider"}, 
    "Banana", { "1": "bread", "2": "Republic" } 
] 

DEMO

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