Является ли элемент ассоциативного массива тем же, что и поле объекта? - PullRequest
0 голосов
/ 25 января 2011

У меня есть объект, который выглядит примерно так.

var obj = {
    speed: 10,
    volume: 14,
    aux_deform: 1.8,
    energy: 21.5,
    aux_energy: 0.2
}

Во время выполнения будут добавлены дополнительные поля / свойства, поэтому объект может содержать любое количество свойств в любой момент времени.Как вы можете видеть в моем примере объекта, некоторые свойства могут начинаться с «aux _».

Теперь я хочу создать еще один объект из этого объекта, который будет содержать только свойства, начинающиеся с «aux _».

То, как я это делаю сейчас, выглядит примерно так.

var newObj = [];
for(prop in obj)
{
    if (prop.startsWith('aux_'))
    {
        newObj[prop] = obj[prop];
    }
}

Теперь у меня есть новый объект, и я могу сделать что-то вроде:

alert(newObj.aux_energy);

Это работает нормально, ноМне интересно, если это правильный подход.Есть ли какой-нибудь более простой способ или более элегантный способ достижения того, чего я пытаюсь достичь?Есть ли какие-либо (с точки зрения безопасности или технические) проблемы / проблемы с этим способом создания объектов?

И вопрос из заголовка: действительно ли вновь созданный объект является ассоциативным массивом со свойствами в качестве ключей (поскольку он создан таким образом) или есть какая-либо разница.

1 Ответ

3 голосов
/ 25 января 2011

В Java Script нет ассоциативных массивов, есть только объекты JSON, которые можно использовать вместо ассоциативных массивов. Что вы сделали здесь, так это то, что вы объявили массив с именем newObj, а затем добавили свойства в этот массив. Это может привести к неожиданному поведению при попытке использовать buit в методах Array или при переборе по нему. Основное различие между объектами и массивами JSON состоит в том, что свойства в объектах не сортируются, и итерирование по ним может привести к случайным и непредсказуемым результатам.

Более подходящим способом записи было бы объявить объект newObj = {}, а затем просто скопировать нужные вам свойства.

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

Кроме того, это единственный способ сделать это, и это прекрасно.

...