2015-08-06 2 views
-1

У меня есть массив объектов, и я не могу преобразовать его в объект. Массив объекта, который у меня есть, как показано ниже:Как преобразовать массив объекта в объект?

var x = [{ 
    name: "a", 
    items: [{ 
     name: "b", 
     items: [{ 
       name: "c" 
       }] 
     }] 
    }, 
    { 
    name: "d", 
    items: [{ 
     name: "e", 
     items: [{ 
       name: "f" 
     }] 
    }] 
}]; 

и я хочу, чтобы преобразовать его в объект, как это:

{ 
name: "a", 
items: [{ 
    name: "b", 
    items: [{ 
     name: "c" 
    }] 
    }] 
},{ 
name: "d", 
items: [{ 
    name: "e", 
    items: [{ 
     name: "f" 
    }] 
    }] 
} 

Я использовал один из StackOverflow раствора

function toObject(arr) { 
     var rv = {}; 
     for (var i = 0; i < arr.length; ++i) 
     rv[i] = arr[i]; 
     return rv; 
} 

Но он преобразуется следующим образом:

{ 
"0":{ 
    "name":"a", 
    "items":[{"name":"b","items":[{"name":"c"}]}]}, 
"1":{ 
    "name":"d", 
    "items":[{"name":"e","items":[{"name":"f"}]}]} 
} 

Итак, как получить объект в формате, который я дал?

+3

у вас есть только 1 пункт в array, почему бы не 'x = x [0];'? Есть ли еще код для этого? – atmd

+1

На самом деле в массиве есть два элемента, я хочу его в одном объекте. – Thinker

+4

Приведенный вами пример не является объектом. Есть два объекта, разделенных запятой. Как это должно работать? – Razem

ответ

0

Ниже не один объект

{ 
    name: "a", 
    items: [{ 
     name: "b", 
     items: [{ 
      name: "c" 
     }] 
    }] 
}, // this comma shows you that it's can't be one object. 
{ 
    name: "d", 
    items: [{ 
     name: "e", 
     items: [{ 
      name: "f" 
     }] 
    }] 
} 

Вы не можете иметь объект с двумя различными свойствами одного и того же имени.

0

Вы хотите уменьшить массив в один объект:

var output = x.reduce(function(output, arrayItem) { 
    var key = arrayItem.name; 
    output[key] = arrayItem; 
    return output; 
}, { }); 
0

может быть, вы хотите что-то вроде этого

var x = [{ 
    name: "a", 
    items: [{ 
     name: "b", 
     items: [{ 
       name: "c" 
       }] 
     }] 
    }, 
    { 
    name: "d", 
    items: [{ 
     name: "e", 
     items: [{ 
       name: "f" 
     }] 
    }] 
}]; 


function toObject(arr) { 
     var rv = {}; 
     for (var i = 0; i < arr.length; ++i) 
      rv[arr[i].name] = { items: arr[i].items} ; 
     return rv; 
} 

console.log(toObject(x)); 

http://jsfiddle.net/jypahwj4/

0

Одна из проблем, которые делают ваши нарваться заключается в том, что при создании объекта из этого массива вы будете иметь несколько ключей с тем же именем, чтобы каждый name: будет переопределен следующей попыткой и добавлением к объекту. В вашей функции, потому что вы делаете rv[i], а i - это номер, поэтому вы получаете числа в новом созданном объекте.

Возможное решение будет

function toObject(arr) { 
    var rv = {}; 
    for (var i = 0; i < arr.length; ++i) 
    rv[arr[i].name] = arr[i].items; 
    return rv; 
} 

Но это сделало бы ключ от внешней части объекта равна name: исходного массива объектов

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