Ecto: Как динамически указать имя поля и значение, где клаузулы? [Дубликат]

Я еще не видел этот вариант, который мне лично нравится лучше всего:

Учитывая массив:

var someArray = ["some", "example", "array"];

Вы можете перебрать его, не получив доступ к свойству length :

for (var i=0, item; item=someArray[i]; i++) {
  // item is "some", then "example", then "array"
  // i is the index of item in the array
  alert("someArray[" + i + "]: " + item);
}

См. этот JsFiddle, демонстрирующий, что: http://jsfiddle.net/prvzk/

Это работает только для массивов, которые являются не разреженный. Это означает, что на каждом индексе в массиве действительно есть значение. Тем не менее, я обнаружил, что на практике я почти никогда не использую разреженные массивы в Javascript ... В таких случаях обычно проще использовать объект в качестве карты / хэш-таблицы. Если у вас есть разреженный массив и вы хотите зациклиться на 0 .. length-1, вам понадобится построить for (var i = 0; i & lt; someArray.length; ++ i), но вам все равно нужно, если внутри цикл, чтобы проверить, действительно ли элемент в текущем индексе определен.

Кроме того, как упоминает CMS в комментарии ниже, вы можете использовать это только на массивах, которые не содержат значений фальшивых значений. Массив строк из примера работает, но если у вас есть пустые строки или цифры 0 или NaN и т. Д., Цикл будет прерваться преждевременно. Снова на практике это почти никогда не проблема для меня, но это то, что нужно помнить, что заставляет задуматься, прежде чем использовать его ... Это может дисквалифицировать его для некоторых людей:)

Что мне нравится в этом цикле:

  • Недостаточно записи
  • Нет необходимости в доступе (не говоря уже о кеше) свойства length
  • Элемент доступа автоматически определяется внутри тела цикла под именем, которое вы выбираете.
  • Сочетает очень естественно с array.push и array.splice для использования массивов, таких как списки / стеки

Причина этого в том, что спецификация массива требует, чтобы при чтении элемента из индекса> = длина массива он возвращался не определен. Когда вы пишете в такое место, оно фактически обновит длину.

Для меня эта конструкция наиболее точно имитирует синтаксис Java 5, который мне нравится:

for (String item : someArray) {
}

... с дополнительным преимуществом, также зная о текущем индексе внутри цикла

5
задан Joshua Rieken 6 January 2016 в 20:56
поделиться

1 ответ

Вам нужно использовать поле / 2 для динамического создания полей в запросах:

query
|> select([x], count(field(x, ^field_name), :distinct))

Пример использования другого синтаксиса запроса для завершения:

from x in query,
  select: count(field(x, ^field_name), :distinct)
12
ответ дан Gazler 27 August 2018 в 16:15
поделиться
Другие вопросы по тегам:

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