2013-07-19 4 views
0

У меня есть JavaScript Object и когда я JSON.stringify, он выглядит следующим образомПреобразование массива Javascript объектов в массиве Javascript

[ 
    { 
     "item_id": null, 
     "parent_id": "none", 
     "depth": 0, 
     "left": "1", 
     "right": 4 
    }, 
    { 
     "item_id": "1", 
     "parent_id": null, 
     "depth": 1, 
     "left": 2, 
     "right": 3 
    } 
] 

Я хочу, чтобы преобразовать его в многомерном массиве, который выглядит как следующие

item[0][0] = item_id 
item[0][1] = parent_id 
item[0][2] = depth 
item[0][3] = left 
item[0][4] = right 

item[1][0] = item_id 
item[1][1] = parent_id 
item[1][2] = depth 
item[1][3] = left 
item[1][4] = right 

Любая помощь будет оценена :)

Edit: Понял работает с помощью всего :) Спасибо всем за помощь.

+0

Пожалуйста, внесите ваш код пока мы можем помочь. – elclanrs

+0

Зачем вам нужен массив? – DarkBee

+0

Вы хотите, чтобы массив имел их ключи или соответствующие значения –

ответ

4

Ну давайте возьмем начальный объект (массив) до stringify. С этим мы можем зацикливать каждый элемент. Затем мы можем создать новый массив для каждого свойства. Что-то вроде этого:

var myObject = X;//this is your original object 
var newArray = []; 

for(var i = 0; i < myObject.length; i++){ 
    var item = myObject[i]; 
    var subArray = []; 
    subArray.push(item["item_id"]); 
    subArray.push(item["parent_id"]); 
    subArray.push(item["depth"]); 
    subArray.push(item["left"]); 
    subArray.push(item["right"]); 
    newArray.push(subArray); 
} 

Here is a working example (проверьте консоль для результата)

ПРИМЕЧАНИЯ: Я намеренно избегать использования for in петли из-за слухи, я всегда слышу о надежности заказа. Конечно, если вы доверяете ему, это ваш звонок, но я предпочитаю играть на безопасной стороне. You can read some other opinions of this matter here.


Если вы хотите, чтобы повысить производительность, вы можете создать массив непосредственно из значений, например, так:

for (var i = 0; i < myObject.length; i++) { 
    var item = myObject[i]; 
    var subArray = [item["item_id"], item["parent_id"], item["depth"], item["left"], item["right"]]; 
    newArray.push(subArray); 
} 

Это примерно в два раза быстрее производительность мудрый, here is the proof

+0

Спасибо, получил его работу :) – NishanCK

+1

Как насчет замены этих строк: 'newArray.push ([" item_id "," parent_id "," depth "," left "," right "]. Reduce (function (p, c) {return p.concat (item [c]);}, [])); ' – Amberlamps

+1

@Amberlamps: Нет, спасибо, я хотел бы убедиться, что мои ответы могут быть поняты OP ;-) – musefan

1

Ваш «object» на самом деле является массивом.

var item = []; 
for (var i=0; i<yourArray.length; i++) { 
    var subArray = []; 
    var obj = yourArray[i]; 
    for (var j in obj) { 
     subArray.push(j); 
    } 
    item.push(subArray); 
} 
+2

Вы должны извлечь значение поля, а не имя поля. –

+0

Нет, вопрос задает имя поля. –

+0

На самом деле вопрос на самом деле не совсем ясен, но давайте, очевидно, что OP означает значения не ключей. – Amberlamps

0

карта ваших элементов массива перебором полей каждого из объектов

-2

С рекурсией, для не ограниченных размеров данных объект:

fiddle

function isArray($obj) { 
    return Object.prototype.toString.call($obj) === '[object Array]'; 
} 

function subObject(data) { 


    if(isArray(data)){ 
     return (subArray(data)); 
    } 

    var result = []; 
    for (var i in data) { 
     var item = data[i]; 
     if (item === null) { // null type is ojbect ..! 
      result.push(item); 
     } else if (isArray(item)) { 
      result.push(subArray(item)); 
     } else if (typeof item === 'object') { 
      result.push(subObject(item)); 
     } else { 
      result.push(item); 
     } 
    } 
    return result; 
} 

function subArray(data) { 
    var result = []; 

    for (var i = 0; i < data.length; i++) { 
     var item = data[i]; 
     if (item === null) { // null type is ojbect ..! 
      result.push(item); 
     } else if (isArray(item)) { 
      result.push(subArray(item)); 
     } else if (typeof item === 'object') { 
      result.push(subObject(item)); 
     } else { 
      result.push(item); 
     } 
    } 
    return result; 
} 

var r = subObject(data); 
console.log(r); 
+2

Рекурсия слишком много для этой проблемы. OP ничего не говорит о больших размерах. Кроме того, тип массива - «объект»! – Amberlamps

+0

это фактически не работает. Если вы выбрали опорную ошибку «null» для одного из рекурсивных вызовов – musefan

+1

Не используйте 'for ... in' на массивах. Чтобы проверить, является ли переменная массивом или нет, используйте 'Object.prototype.toString.call (item) === '[object Array]'' – Amberlamps

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