Получение первого индекса объекта

Глобальные переменные не обязательно плохие, так же как макросы не обязательно плохие, а обогащенный уран не обязательно плохой. Пока вы принимаете осознанное решение о плюсах и минусах данного выбора дизайна, у вас все будет в порядке.

Некоторые из аргументов против глобальных переменных:

  1. Они нарушают хороший объектно-ориентированный дизайн
  2. Они делают ваш код трудным для юнит-тестирования, поскольку вы не можете тестировать отдельные блоки кода без установки всех глобальных переменных, которые код ожидает увидеть
  3. Они увеличивают сцепление в вашем коде: действия в одном блоке кода могут влиять на вещи в другом блоке кода непредсказуемым образом через общую глобальную переменную

Некоторые из аргументов для глобальных переменных:

  1. Они облегчают совместное использование одного ресурса между многие функции
  2. Они могут облегчить чтение кода

Если в вашем проекте глобальные переменные имеют смысл, и их можно использовать для упрощения чтения или поддержки вашего кода , не настраивая себя на случайные ошибки и проверяя головные боли, тогда непременно используйте их.

Я пишу много кода на C для встроенных микроконтроллеров и постоянно использую глобальные переменные. В такой жесткой системе глобальные переменные имеют смысл. Я знаю о потенциальных недостатках, но я проанализировал плюсы и минусы. минусы и я пишу свой код, чтобы защититься от основных ловушек.

Итог: нет жесткого и быстрого правила. Просто примите лучшее решение для вашего конкретного проекта или платформы, основываясь на лучшей информации, которую вы имеете.

196
задан Sebastian Simon 10 August 2017 в 16:02
поделиться

6 ответов

Если порядок объектов имеет значение, вам следует пересмотреть схему JSON для хранения объектов в массиве:

[
    {"name":"foo", ...},
    {"name":"bar", ...},
    {"name":"baz", ...}
]

или, возможно,:

[
    ["foo", {}],
    ["bar", {}],
    ["baz", {}]
]

Как указывает Бен Альперт, свойства объектов Javascript не упорядочены, и ваш код не работает, если вы ожидаете, что они будут перечисляться в том же порядке, в котором они указаны в литерале объекта - нет свойства "first".

61
ответ дан 23 November 2019 в 05:16
поделиться

Невозможно получить первый элемент, поскольку «хэши» (объекты) в JavaScript имеют неупорядоченные свойства. Лучше всего хранить ключи в массиве:

var keys = ["foo", "bar", "baz"];

Затем используйте это, чтобы получить правильное значение:

object[keys[0]]
17
ответ дан 23 November 2019 в 05:16
поделиться

они не на самом деле упорядочены, но вы можете сделать:

var first;
for (var i in obj) {
    if (obj.hasOwnProperty(i) && typeof(i) !== 'function') {
        first = obj[i];
        break;
    }
}

.hasOwnProperty () важен для игнорирования прототипов объектов.

77
ответ дан 23 November 2019 в 05:16
поделиться

Вчера у меня была такая же проблема. Я решил это так:

var obj = {
        foo:{},
        bar:{},
        baz:{}
    },
   first = null,
   key = null;
for (var key in obj) {
    first = obj[key];
    if(typeof(first) !== 'function') {
        break;
    }
}
// first is the first enumerated property, and key it's corresponding key.

Не самое элегантное решение, и я почти уверен, что оно может давать разные результаты в разных браузерах (т.е. в спецификациях сказано, что перечисление не требуется для перечисления свойств в том же порядке, в каком они были определено). Однако в моем объекте было только одно свойство, так что это не было проблемой. Мне просто нужен был первый ключ.

10
ответ дан 23 November 2019 в 05:16
поделиться

Вы можете сделать что-то вроде этого:

var object = {
    foo:{a:'first'},
    bar:{},
    baz:{}
}


function getAttributeByIndex(obj, index){
  var i = 0;
  for (var attr in obj){
    if (index === i){
      return obj[attr];
    }
    i++;
  }
  return null;
}


var first = getAttributeByIndex(object, 0); // returns the value of the
                                            // first (0 index) attribute
                                            // of the object ( {a:'first'} )
6
ответ дан 23 November 2019 в 05:16
поделиться

Если вам нужно что-то лаконичное, попробуйте:

for (first in obj) break;

alert(first);

обернутое в функцию:

function first(obj) {
    for (var a in obj) return a;
}
204
ответ дан 23 November 2019 в 05:16
поделиться
Другие вопросы по тегам:

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