Foreach объектов



  • Понадобилось тут сделать foreach объекта, а оказывается, там только массив.
    Написал код, который поддерживает foreach и для объектов. Добавьте в следующую версию, наверняка будет полезно)

    <script type="text/template" id="foreach_code">
          <% var r = Math.floor(Math.random() * (999999 - 100000) + 100000) %>
    	  IS_OBJECT_<%= r %> = (typeof <%= for_array %>) === 'object';
    	  if(IS_OBJECT_<%= r %>){
    	  FOREACH_ARRAY_<%= r %> = [];
    	  var tmp = {};
    	  for(var key in <%= for_array %>){
    		tmp = {};
    		tmp[key] = <%= for_array %>[key];
    		FOREACH_ARRAY_<%= r %>.push(tmp);
    		}
    	  }else{
    		FOREACH_ARRAY_<%= r %> = <%= for_array %>
    	  }
          _do(function(){
            VAR_CYCLE_INDEX = _iterator() - 1
            if(VAR_CYCLE_INDEX > FOREACH_ARRAY_<%= r %>.length - 1)_break();
    		if(IS_OBJECT_<%= r %>){
    			for(var key in FOREACH_ARRAY_<%= r %>[VAR_CYCLE_INDEX]){
    			VAR_FOREACH_KEY = key;
    			break;
    			}
    	  VAR_FOREACH_DATA = FOREACH_ARRAY_<%= r %>[VAR_CYCLE_INDEX][VAR_FOREACH_KEY]
    	  }else{
    	  VAR_FOREACH_DATA = FOREACH_ARRAY_<%= r %>[VAR_CYCLE_INDEX]
    	  }
            
            section_insert()
          })!
      </script>
    

    Надеюсь, нигде не ошибся, при тестах код работал. На гитхаб лень было заливать, поэтому тут скинул)


  • administrators

    @blackhacker Спасибо за ваши старания, но я не могу принять эту реализацию по 2 причинам.

    1. Очень сложно сделано, можно сделать одной строчкой - обернуть объект который передается в foreach в Object.values()
    2. В foreach для массивов должна быть возможность обращаться к ключу и к значению отдельно.


  • This post is deleted!


  • @support Сначала думал, ошибся с правильностью своего ответа и удалил его. А оказалось, все верно было. Если получать значения объекта через Object.values, как получить ключ при Foreach? В моем подходе (пусть и немного громоздком), есть доступ к ключу перебираемого объекта. Даже если получать ключи через Object.keys и значения через Object.values, все равно придется хранить их в двух массивах и считывать при переборе, и количество кода будет примерно такое же, если не больше. Но, как говорят, "мое дело предложить")

    P.S. память очищается после перебора массива? Там временная переменная же создается. Если массив будет очень большой, и перебираться часто, то будет накапливаться потребление памяти.


  • administrators

    @blackhacker

    P.S. память очищается после перебора массива? Там временная переменная же создается. Если массив будет очень большой, и перебираться часто, то будет накапливаться потребление памяти.

    Нет, не очищается. Раньше была одна переменная, сейчас там добавлен случайный индекс, возможно в этом проблема.

    По поводу расширения foreach, я подумаю



  • @support said in Foreach объектов:

    Нет, не очищается. Раньше была одна переменная, сейчас там добавлен случайный индекс, возможно в этом проблема.

    Случайный индекс нужен, насколько я понял, чтобы не было конфликтов, если делать цикл в цикле. Можно в конце секции с циклом очищать все такие временные переменные тогда.

    И при чтении\записи глобальной переменнной тоже неплохо бы поменять, чтобы временная переменная не использовалась, а сразу передавалось значение функции JSON.stringify


  • administrators

    @blackhacker said in Foreach объектов:

    Случайный индекс нужен, насколько я понял, чтобы не было конфликтов, если делать цикл в цикле. Можно в конце секции с циклом очищать все такие временные переменные тогда.

    Да, поправлю.

    И при чтении\записи глобальной переменнной тоже неплохо бы поменять, чтобы временная переменная не использовалась, а сразу передавалось значение функции JSON.stringify

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