Массивы Javascript - это объекты. Подробнее см. В https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Predefined_Core_Objects#Array_Object .
Примечание: если вы поставьте нецелое значение для оператора массива в приведенном выше коде, свойство будет создано в объекте, представляющем массив, вместо элемента массива.
blockquote>JSON поддерживает только подмножество Javascript. Подробнее см. В http://www.json.org/ .
JSON построен на двух структурах:
blockquote>
- Коллекция пар имен / значений. На разных языках это реализуется как объект, запись, структура, словарь, хэш-таблица, список клавиш или ассоциативный массив.
- Упорядоченный список значений. В большинстве языков это реализуется как массив, вектор, список или последовательность.
Массив Javascript, который имеет свойства, созданные в базовом объекте, не вписывается ни в один из эти структуры, поскольку в ней есть как набор пар имя / значение, так и упорядоченный список значений, поэтому нет простого способа представления такого объекта непосредственно в JSON.
Метод JSON.stringify определен в спецификации ECMAScript. Например, см. http://www.ecma-international.org/ecma-262/5.1/#sec-15.12.3 .
Хотя есть много деталей, бит, который имеет значение здесь, - это то, как строятся значения объекта:
Если Type (value) - Object, а IsCallable (значение) - false
blockquote>
- Если кнопка [ [Class]] внутреннее свойство value - «Array», а затем возвращает результат вызова абстрактной операции JA с аргументом.
- Else, возвращает результат вызова абстрактной операции JO с аргументом.
Учитывая ваш массив, несмотря на добавление параметров к базовому объекту, результатом является упорядочение упорядоченного набора элементов массива, а не основного объекта.
Нет ничего плохого в добавлении параметров в объект массива, но они не являются частью массива, а функции или методы, которые обрабатывают массивы, могут игнорировать их или решать с ними произвольно. Вы видели, что JSON.stringify игнорирует дополнительные параметры. Другие функции могут работать иначе - вам нужно будет узнать в каждом случае.
Хотя это не так, вероятно, будет легче понять, если вы не добавляете свойства к объектам массива. Если вы хотите добавить свойства, начните с объекта без массива.
Вместо:
var b = []; b['foo'] = 56; b['bar'] = 78;
Вы можете использовать:
var b = {}; b['foo'] = 56; b['bar'] = 78;
R не имеет никакого способа контролировать приоритет оператора. Это описано на странице справки ?Syntax
. Ваша проблема в том, что отрицание имеет более низкий приоритет, чем специальные операторы, поэтому
!q %->% !p
анализируется как
!(q %->% !p)
Возможно, лучший совет - не пытаться использовать R для проекта, который вы продолжаем работать, так как он не предназначен для такого рода вещей. Однако то, что вы хотите , может быть возможным: R позволяет вам видеть дерево разбора из выражения и сообщает, где встречаются круглые скобки:
> getParseData(parse(text="!q %->% !p"))
line1 col1 line2 col2 id parent token terminal text
11 1 1 1 10 11 0 expr FALSE
1 1 1 1 1 1 11 '!' TRUE !
10 1 2 1 10 10 11 expr FALSE
2 1 2 1 2 2 4 SYMBOL TRUE q
4 1 2 1 2 4 10 expr FALSE
3 1 4 1 7 3 10 SPECIAL TRUE %->%
9 1 9 1 10 9 10 expr FALSE
5 1 9 1 9 5 9 '!' TRUE !
6 1 10 1 10 6 8 SYMBOL TRUE p
8 1 10 1 10 8 9 expr FALSE
Возможно, это позволит вам написать функция, которая может изменить выражение, чтобы дать !
более высокий приоритет, чем %->%
.
В качестве альтернативы ваша функция может просто выполнить подстановку текста, чтобы перед синтаксическим анализом заменить %->%
или !
на другой оператор приоритета, а затем изменить его обратно до оценки.