Sign up ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free.

Here's my array (from chrome console) :

array in Chrome console

Here's the pertinent part of code :

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

In chrome's console i get [] from the last line. I should get {'Mon':{...}...}

Here is the minimal amount of javascript to reproduce the issue

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

I tried some others stuff like Convert array to JSON or Convert javascript object or array to json for ajax data but the problem remains :/

Thanks for help.

share|improve this question

closed as off-topic by Ben Fortune, Vohuman, Grundy, Anthony Grist, Daniel A. White Feb 13 at 13:52

This question appears to be off-topic. The users who voted to close gave this specific reason:

  • "Questions seeking debugging help ("why isn't this code working?") must include the desired behavior, a specific problem or error and the shortest code necessary to reproduce it in the question itself. Questions without a clear problem statement are not useful to other readers. See: How to create a Minimal, Complete, and Verifiable example." – Ben Fortune, Vohuman, Grundy, Anthony Grist, Daniel A. White
If this question can be reworded to fit the rules in the help center, please edit the question.

    
Could you make a live example on jsfiddle.net for example? – leopik Feb 13 at 13:38
2  
where do you get Hours from? It doesn't seem like a js array, it seems more like an object.. – satchcoder Feb 13 at 13:38
4  
You have an object masquerading as an array there - the length says zero and the properties are named. – Jamiec Feb 13 at 13:40
2  
It looks like you've created arrays ([]) when you actually need objects ({}). In JavaScript if you want to use non-numerical keys (e.g. "11h30") you'll need to use an object instead. – Juhana Feb 13 at 13:40
    
Possible duplicate of passing an array to json.stringify, though the answers there don't go into great detail about why an object is necessary versus an array. – apsillers Feb 13 at 13:45

3 Answers 3

up vote 2 down vote accepted

Here is the minimal amount of javascript to reproduce the issue

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

The issue with the above is that, while javascript will be happy to let you late-bind new properties onto Array, JSON.stringify() will only attempt to serialize the actual elements in the array.

A minimal change to make the object an actual object, and JSON.stringify works as expected:

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"}
share|improve this answer
    
It work !You are awesome =) – Eat Salad Feb 13 at 13:51

Like all JavaScript objects, Arrays can have properties with string-based keys like the ones you're using. But only integer keys (or keys that can be cleanly converted to integers) are actually treated as elements of an Array. This is why JSON isn't catching your properties, and it's also why your Arrays are all reporting their length as zero.

If you really need to use non-integer keys, you should be using plain Objects, not Arrays. This method has its own gotchas -for example, you need to be careful with for-in loops- but JSON will work the way you expect it to.

var hours = {
    "Mon" : {
        "11h30" : "15h00",
        "18h30" : "21h30"
    }, 
    "Tue" : {},
    "Wed" : {
        "11h30" : "15h00",
        "18h30" : "21h30"
    }, 
    "Thu" : {},
    "Fri" : {},
    "Sat" : {},
    "Sun" : {
        "11h30" : "15h00",
        "18h30" : "21h30"
    }, 
}
share|improve this answer
    
Yeah, but my form is almost entirely dynamic so i can't use this solution. – Eat Salad Feb 13 at 13:51

In javascript arrays have indexes that are numeric keys. JSON.stringify assumes that an array have only properties which are numbers.

You want to use an object, as what you have is not an array, but resembles a dictionary.

Here is an example I made: http://jsfiddle.net/developerwithacaffeineproblem/pmxt8bwf/2/

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

JSON.stringify(object)

Results in:
"{"age":1,"cars":2,"girlfriends":3}"

Afterwards when you parse the data if you want to iterate it you can use a piece of code similiar to this:

for (var key in yourobject) {
  if (yourobject.hasOwnProperty(key)) {
     console.log(key, yourobject[key]);
  }
}
share|improve this answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.