Javascript объект для массива - PullRequest
3 голосов
/ 02 июня 2011

У меня возникли некоторые проблемы с конвертацией JSON, и мне нужна помощь.Это моя проблема, у меня JSON вернул следующее:

Пример получения JSON (из файла CSV):

[
    {
        "rating": "0",
        "title": "The Killing Kind",
        "author": "John Connolly",
        "type": "Book",
        "asin": "0340771224",
        "tags": "",
        "review": "i still haven't had time to read this one..."
    },
    {
        "rating": "0",
        "title": "The Third Secret",
        "author": "Steve Berry",
        "type": "Book",
        "asin": "0340899263",
        "tags": "",
        "review": "need to find time to read this book"
    },

    cut for brevity   

]

Теперь, это одномерный массив объектов,но у меня есть функция, которая мне нужна, чтобы передать это ТОЛЬКО многомерный массив.Там нет ничего, что я могу изменить в этом.Я искал в интернете для конверсии и наткнулся на этот код:

if (! obj.length) { return [];} // length must be set on the object, or it is not iterable  
   var a = [];  

   try {  
       a = Array.prototype.slice.call(obj, n);  
   }  
   // IE 6 and posssibly other browsers will throw an exception, so catch it and use brute force  
   catch(e) {  
       Core.batch(obj, function(o, i) {  
           if (n <= i) {  
               a[i - n] = o;  
           }  
       });  
   }  

   return a;  

Но мой код застревает на части "без длины объекта".Когда я перебираю каждый объект, я получаю символ за символом.К сожалению, эти имена полей (рейтинг, заголовок, автор) и т. Д. Не заданы в камне, и я не могу получить доступ к чему-либо, используя запись obj.Field.Есть ли способ конвертировать эти объекты в массивы, или я должен вернуться к началу и сбросить JSON?

Ответы [ 4 ]

4 голосов
/ 02 июня 2011

Существует хорошая библиотека JavaScript с именем Undersore.js , которая выполняет все виды манипуляций с объектами / массивами.

Используя ее, вы можете сделать преобразование столь же простым, как этот

_(json).each(function(elem, key){
    json[key] = _(elem).values();
});
4 голосов
/ 02 июня 2011

Если я вас правильно понимаю, вам нужно знать две вещи:

Одна из них заключается в том, что object.member также можно записать как object["member"].Это означает, что вам не нужно жестко кодировать имена своих свойств в свой объект для транслятора массива, но вы можете рассматривать их как строки.

Второй - оператор for-in (см. раздел 12.6.4 ).Для объекта это циклически проходит по всем его элементам.

Следующее приведет к тому, что innerArray будет массивом, содержащим все значения всех членов объекта

var innerArray = [];
for (property in object) {
    innerArray.push(object[property]);
}

Использование этогознание, вы можете настроить массив так, чтобы он содержал любую информацию, которая вам нужна для извлечения из объектов json.

0 голосов
/ 08 марта 2013

Существует простой способ сделать это

с одномерным объектом:

var myarrayfromobject = new Array();
$H(myobject).each(function(item, i){
    myarrayfromobject[i] = item;
});

Если у вас есть многомерный объект, вы можете использовать ту же идею, используя рекурсивную функцию или цикл, проверяя тип элемента.

0 голосов
/ 02 июня 2011

Будет выведено:

var newJSON = [];

for (var i = 0, len = json.length; i < len; i++)
{
    newJSON.push([json[i]]);
}

Into ...

[
 [Object { rating="0", title="The Killing Kind", more...}],
 [Object { rating="0", title="The Third Secret", more...}]
]

Fiddle: http://jsfiddle.net/Ta6hW/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...