json.stringify возвращает нулевой массив в javascript [дубликат]

3
задан RocketNuts 21 August 2014 в 10:04
поделиться

3 ответа

Массивы Javascript - это объекты. Подробнее см. В https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Predefined_Core_Objects#Array_Object .

Примечание: если вы поставьте нецелое значение для оператора массива в приведенном выше коде, свойство будет создано в объекте, представляющем массив, вместо элемента массива.

JSON поддерживает только подмножество Javascript. Подробнее см. В http://www.json.org/ .

JSON построен на двух структурах:

  • Коллекция пар имен / значений. На разных языках это реализуется как объект, запись, структура, словарь, хэш-таблица, список клавиш или ассоциативный массив.
  • Упорядоченный список значений. В большинстве языков это реализуется как массив, вектор, список или последовательность.

Массив Javascript, который имеет свойства, созданные в базовом объекте, не вписывается ни в один из эти структуры, поскольку в ней есть как набор пар имя / значение, так и упорядоченный список значений, поэтому нет простого способа представления такого объекта непосредственно в JSON.

Метод JSON.stringify определен в спецификации ECMAScript. Например, см. http://www.ecma-international.org/ecma-262/5.1/#sec-15.12.3 .

Хотя есть много деталей, бит, который имеет значение здесь, - это то, как строятся значения объекта:

Если Type (value) - Object, а IsCallable (значение) - false

  • Если кнопка [ [Class]] внутреннее свойство value - «Array», а затем возвращает результат вызова абстрактной операции JA с аргументом.
  • Else, возвращает результат вызова абстрактной операции JO с аргументом.

Учитывая ваш массив, несмотря на добавление параметров к базовому объекту, результатом является упорядочение упорядоченного набора элементов массива, а не основного объекта.

Нет ничего плохого в добавлении параметров в объект массива, но они не являются частью массива, а функции или методы, которые обрабатывают массивы, могут игнорировать их или решать с ними произвольно. Вы видели, что JSON.stringify игнорирует дополнительные параметры. Другие функции могут работать иначе - вам нужно будет узнать в каждом случае.

Хотя это не так, вероятно, будет легче понять, если вы не добавляете свойства к объектам массива. Если вы хотите добавить свойства, начните с объекта без массива.

Вместо:

var b = [];
b['foo'] = 56;
b['bar'] = 78;

Вы можете использовать:

var b = {};
b['foo'] = 56;
b['bar'] = 78;
4
ответ дан Ian 18 August 2018 в 00:30
поделиться

Javascript не поддерживает ассоциативные массивы (как PHP).

var b = []; Объявление явного массива при попытке создать объект.

Массивы в Javascript могут содержат только индексный подход массивов, тогда как объекты больше ассоциативных массивов.

Если вы измените var b = []; на var b = {};, это решит проблему.

var b = {} Объявление явно объект.

5
ответ дан Linial 18 August 2018 в 00:30
поделиться
  • 1
    Что вы имеете в виду, не поддерживает ассоциативные массивы? Вышеупомянутые работы (за исключением json stringify), впоследствии я могу использовать b ['foo'] и b ['bar'], и это дает ожидаемый результат. – RocketNuts 21 August 2014 в 10:26
  • 2
    Я создал для вас Скрипку. jsfiddle.net/shaharlini/xLw2p54e JSON - & gt; Обозначение объекта Javascript. Пожалуйста, посмотрите здесь, чтобы прочитать еще кое-что из Mozilla MDN: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… – Linial 21 August 2014 в 11:20

enter image description here [/g1]

Эта привязка из IE explorer. См. Массив по-прежнему пуст.

На самом деле способ вставки элементов в массив:

1. Используйте push (). 2. Вставьте элементы в массив во время объявления

. Если вы хотите сгенерировать массив, у вас должны быть данные внутри массива.

Итак, теперь вы хотите чтобы выровнять пары значений ключа, поэтому вам нужно передать объект в качестве аргумента JSON.stringify () следующим образом:

var test = {};           // Object
test['a'] = 'test';
test['b'] = [];          // Array
test['b'].push('item');
test['b'].push('item2');
test['b'].push('item3');
var json = JSON.stringify(test);
alert(json);

Решение вашей проблемы сейчас:

enter image description here [/g2]

Примечание. Консоль Google Chrome дает разные результаты, что является ошибкой в ​​Google Chrome.

1
ответ дан Vishal Gupta 18 August 2018 в 00:30
поделиться
  • 1
    Разве это не ошибка в IE? (обычно это ...) Чтобы сказать просто, говорит ли это Hello или нет: var b = []; б [ 'х'] = 'Привет'; оповещение (б [ 'х']); – RocketNuts 21 August 2014 в 11:39
  • 2
    но это не способ вставки значений в массив (проверьте документацию api javascript). Более того, все является объектом в javaScript, поэтому b ['x'] notation действительна для вставки значений в массив, поскольку javascript считает, что создается пара значений ключа, соответствующая объекту .. но как только он определяет, что b является массивом, не вставляет значение в массив .. поэтому массив всегда будет пустым в таком случае .. поэтому JSON.stringify () возвращает пустой массив. JSON.stringify () не может быть ошибочным. – Vishal Gupta 21 August 2014 в 11:45
  • 3
    всегда помните, что массивы на любом языке принимают значение, соответствующее INDEXES. Это грамматика программирования – Vishal Gupta 21 August 2014 в 11:46
Другие вопросы по тегам:

Похожие вопросы: