JSON stringify is not converting array to string I am trying to convert a js array to json string. The array has "string" keys. JSON.stringify is not converting the array to string. This is my code. a=new Array(); a["k1"]="apple"; a["k2"]="berry"; t= JSON.stringify(a); console.log(t); //writes an empty [] to console.
Hi JEET, As far as I can remember, a["k1"]="apple" is an assignment for object property and so is the same as calling a.k1 = 'apple'. So... I guess this "a" object should be initialized as a = {} instead of a = []
Hi, @hdewantara a["k1"]="value" works for both arrays and objects, only the declaration decides if "a" will be an object or array. Anyways, I dropped the idea of using JSON. Going with sending array parameters as URL querystring instead. That worked fine. Thanks
If you're trying to turn it into json to send as data in an ajax request just let jquery do it and create the data array. Something from what I've been working on. let sData = { 'lat': coord.lat, 'lng' : coord.lng, 'photo': p.options.data.image, 'name' : p.options.data.title }; window.plugin.savep.saveList.push(sData); $.ajax({ dataType: "json", url: 'https://www.mysite.com/saveBatch.php', data: window.plugin.savep.saveList, success: function(rData){ //console.log(rData); } }); Code (javascript):
Last I knew? No, it doesn't. JavaScript cannot do associative Arrays. This isn't PHP. It indexes MUST be numeric, and even then they're DISCARDED. var a = []; a[4] = 10; a[9] = 11; console.log(a[0]); // outputs 10 console.log(a[1]); // outputs 11 console.log(a[4]); // outputs undefined console.log(a[9]); // outputs undefined Code (markup): JavaScript arrays CANNOT have named indexes, nor do they MAINTAIN indexes, they ALWAYS condense starting at zero regardless of what index you use. Just as if you remove an element from the middle of the Array everything "above" it gets shifted down one index. HOWEVER, your command does put those values on it, but they are there as non-iterable properties of the Array OBJECT, NOT part of the Array's VALUES. var a = []; a['k11'] = 10; a['k19'] = 20; console.log(a); Code (markup): Outputs: Array [] k11: 10 k19: 20 length: 0 <prototype>: Array [] Code (markup): See that ZERO length? You added them to the object that handles the array, and not the array itself. Big difference. They are NOT array iterable declared that way. This is because JavaScript arrays are NOT Arrays, they're pointered lists. Also this is 2020 not 1998, you can stop saying Array(); as we stopped caring about Netscape 4 a decade and a half ago. And FFS @sarahk, "just let jQuery do it" is NOT the bloody answer!
@deathshadow "Only numerical indexes in javascript" used to be true, not any more. Javascript arrays can have string indexes these days, and work very much like objects. Try this: a= []; //or this //a=new Array(); //either is fine a["k"]="ok"; console.log(a["k"]); //outputs "ok" in console. I have already written a whole page around this, with multidimensional arrays, works fine. I will post in review section once done. Thanks
Just because you can access it that way does NOT mean it's part of the "array". That's not how this works. YES, it's there. You can see that in my console output, but what you've done is attached the value to the OBJECT and not the members of the Array. You can do the same thing to a String! a = 'this is a test'; a['k'] = 'not part of the string'; console.log(a['k']); As such any function that you want to treat the array as an iterable will completely ignore those properties you attached. It's no different than doing: a = ['one', 'two', 'three']; a['output'] = function() { for (var i of a) console.log(i); }; a.output(); Code (markup): Will output one, two, three. The output METHOD is not part of the array any more than the PROPERTIES you are putting on the Array OBJECT. They are not in any way, shape, or form part of the array itself. Hence why Array.length would be three in this previous test, and again notice that the Array.length is ZERO in my previous post. You are NOT adding the values to the array in a manner by which ANY Array method -- find, indexOf, foreach, reduce, map, shift, sort -- are going to find them because they're NOT part of the array, they're part of the object interface TO the array, based on the prototype object named Array, which is descended from Object. Hence the difference between an array and the Array object, and why with most JS objects we use the capital letter distinction to differentiate between what it does, and what it is. You can have an object, it inherits from Object. That cap letter means something. You're SO far off the mark it's going to bite you sooner than later. In fact it likely already has. You want an "associative" array PHP style, you have to use an object if you want to iterate it, using (var i in Object). You're getting the Array object, not the array the object accesses. var a = []; a[k] = 47; a[r] = 15; console.log(a.length); // ZERO! Nada, zip, zilch, nein! Code (markup): They're not in the array, they are properties of the Array object instance. Hence why JSON.parse can't see them either. They're not in the array, they're ON the Array object. No more than for/of, Array.forEach, Array.sort, or any other actual Array method would.
Hmm... I get your point now. a["k"]="ok"; console.log(a); //shows empty array a[0]="ok"; console.log(a); //sshows array with value Wish I knew this difference earlier, would have saved me a lot of time. Thanks @deathshadow