2015-02-13 5 views
2

Вот мой массив (из консоли Chrome):массив Array, JSON.stringify() дает пустой массив вместо всего объекта

array in Chrome console

Вот соответствующая часть кода:

console.log(hours); 
var data = JSON.stringify(hours); 
console.log(data); 

В консоли Chrome я получаю [] из последней строки. Я должен получить {'Mon':{...}...}

Вот минимальное количество JavaScript, чтобы воспроизвести проблему:

var test = []; 
test["11h30"] = "15h00" 
test["18h30"] = "21h30" 
console.log(test);  
console.log(JSON.stringify(test)); // outputs [] 

Я попробовал некоторые другие вещи, как Convert array to JSON или Convert javascript object or array to json for ajax data, но проблема остается.

+0

Не могли бы вы привести живой пример на jsfiddle.net например? – leopik

+2

Где вы получаете Часы? Это не похоже на массив js, он больше похож на объект. – satchcoder

+4

У вас есть объект, маскирующий его как массив: «length» говорит «нуль» и свойства называются. – Jamiec

ответ

13

Вот минимальное количество JavaScript, чтобы воспроизвести проблему

var test = []; 
test["11h30"] = "15h00" 
test["18h30"] = "21h30" 
console.log(test);  
console.log(JSON.stringify(test)); // outputs [] 

Проблема с выше является то, что, в то время как Javascript будет рад сообщить вам поздно связывают новые свойства на Array, JSON.stringify() будет только попытка для сериализации фактических элементов в массиве.

Минимальное изменение, чтобы сделать объект реального объекта, и JSON.stringify работы, как и ожидалось:

var test = {}; // here is thre only change. new array ([]) becomes new object ({}) 
test["11h30"] = "15h00" 
test["18h30"] = "21h30" 
console.log(test); 
console.log(JSON.stringify(test)); // outputs {"11h30":"15h00","18h30":"21h30"} 
+1

Это работает! Вы потрясающий =) –

+0

Точно то, что мне нужно! Спасибо :) –

+0

'var fixed = Object.assign ({}, test);' похоже, «исправить» его, если вы не можете отследить, как был вызван массив или не контролировали его. – Chris

1

Как и все объекты JavaScript, Массивы могут иметь свойства строковые на основе ключей, как те, что вы» повторно используя. Но только целые ключи (или ключи, которые можно чисто преобразовать в целые числа) фактически обрабатываются как элементами из массива. Вот почему JSON не улавливает ваши свойства, и поэтому ваши массивы сообщают о своей длине как ноль.

Если вам действительно нужно использовать нецелые ключи, вы должны использовать простые объекты, а не массивы. Этот метод имеет свои собственные gotchas - например, вам нужно быть осторожным с петлями for-in, но JSON будет работать так, как вы ожидаете.

var hours = { 
    "Mon" : { 
     "11h30" : "15h00", 
     "18h30" : "21h30" 
    }, 
    "Tue" : {}, 
    "Wed" : { 
     "11h30" : "15h00", 
     "18h30" : "21h30" 
    }, 
    "Thu" : {}, 
    "Fri" : {}, 
    "Sat" : {}, 
    "Sun" : { 
     "11h30" : "15h00", 
     "18h30" : "21h30" 
    }, 
} 
+0

Да, но моя форма почти полностью динамична, поэтому я не могу использовать это решение. –

1

В массивах javascript есть индексы, которые являются числовыми ключами. JSON.stringify предполагает, что массив имеет только свойства, которые являются числами.

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

Ниже приведен пример, который я сделал: http://jsfiddle.net/developerwithacaffeineproblem/pmxt8bwf/2/

object = Object() 
object["age"] = 1 
object["cars"] = 2 
object["girlfriends"] = 3 

JSON.stringify(object) 

Результаты в:
"{" возраст ": 1," автомобили ": 2," подружки ": 3}"

Впоследствии, когда вы анализируете данные, если хотите их повторить, вы можете использовать код, похожий на этот код:

for (var key in yourobject) { 
    if (yourobject.hasOwnProperty(key)) { 
    console.log(key, yourobject[key]); 
    } 
} 
Смежные вопросы