операция push и length массива, итерация по массиву

У меня есть следующие фрагменты кода в JavaScript

myArr = []; 
myArr.push(3); 
myArr.push(5); 
myArr.push(11); 

// console.log(myArr.length)

le = myArr.length;
for (var i=0; i < le; i++) {
     elem = myArr[i];
     // ...  e.g.
     console.log(elem)

}

Как выглядит перевод на LiveCode? Или, другими словами, как эмулировать операцию переместить элемент в массив и запросить длину массива?

Примечание: кажется, что LiveCode поддерживает только ассоциативные массивы, и я еще не нашел "шпаргалку" по реализованным операциям с массивами.

Прокомментируйте ответы

Первый ответ дал Марк. Это дает общее представление о том, как это сделать. Затем Алекс заставил код работать. Спасибо вам обоим.


person z--    schedule 18.07.2013    source источник


Ответы (2)


Решение от Марка не совсем правильное; вы не можете использовать «push» в качестве имени обработчика, потому что «push» — это зарезервированное слово в Livecode; в приведенном ниже коде я изменил его, чтобы использовать «mypush»

Кроме того, ваша версия не будет работать правильно, потому что вы поместили объявление «myArray» внутри обработчика «mouseup», что делает глобальный массив доступным только внутри этого обработчика. Итак, далее, когда вы получаете доступ к 'myArray' в обработчике 'push', вы фактически объявляете локальную, неявно объявленную переменную.

Вот версия кода, измененная для учета обеих этих проблем, которая (кажется) работает правильно.

global myArray
on mouseUp
   mypush 3  
   mypush 5  
   mypush 7
   repeat for each key myKey in myArray
      put myArray[myKey] & cr after msg
   end repeat
end mouseUp

on mypush elem
   local myMaxKey
   put item 2 of the extents of myArray into myMaxKey
   put elem into myArray[myMaxKey+1]
end mypush
person Alex Tweedly    schedule 19.07.2013

Я думаю, вы ищете это:

repeat for each key myKey in myArray
  put myArray[myKey] & cr after msg
end repeat

Вам не нужны все эти причудливые вещи JS.

Если у вас есть числовой массив, вы можете сделать это:

put item 2 of the extents of myArray into myMaxKey
put "something" into myArray[myMaxKey+1]

Это будет имитировать команду push в JS. Вы также можете сделать это по-другому:

on mouseUp
   put "a,b,c" into myArray
   split myArray by comma
   put the keys of myArray
   combine myArray by tab
   put tab & "d" after myArray
   split myArray by tab
   put cr & cr & the keys of myArray after msg
end mouseUp

Если вы хотите «эмулировать push-уведомления», вы можете сделать следующее:

local lArray
on mouseUp
  xpush 3
  xpush 5
  xpush 7
  repeat for each key myKey in lArray
     put lArray[myKey] & cr after field 1
  end repeat
end mouseUp

on xpush theElem
   local myMaxKey
   put item 2 of the extents of lArray into myMaxKey
   put theElem into lArray[myMaxKey+1]
end xpush

Обратите внимание, что lArray объявляется вне всех обработчиков, а myMaxKey объявляется внутри обработчика push, хотя обе переменные являются локальными.

person Mark    schedule 18.07.2013
comment
+1 ... единственное, что я мог бы добавить, это то, что вы также можете получить длину через количество элементов myArray - person Monte Goulding; 19.07.2013
comment
Возможно, мы также можем добавить повтор для каждого элемента anElement в myArray, который перебирает каждый элемент в массиве. - person hliljegren; 19.07.2013
comment
Чтобы уточнить: если вы используете для каждого элемента anElement... в первом коде выше, anElement станет таким же, как myArray[myKey]: поместите anElement & cr после msg - person hliljegren; 19.07.2013
comment
Монте, экстенты и количество элементов не одно и то же. Конечно, можно, но я не уверен, что это будет лучше. - person Mark; 19.07.2013
comment
Хлильегрен, я бы тоже хотел. - person Mark; 19.07.2013
comment
Спасибо за твой ответ. Я добавил это в вопрос. Итерация работает, а операция push еще нет. Кроме того, стоит отметить, что массив объявляется неявно, сначала начиная использовать его с синтаксисом массива. - person z--; 19.07.2013
comment
Для чего вам нужна эмулированная операция push? Я не понимаю. Это кажется чем-то, что вам не нужно в LiveCode. Пожалуйста, объясните, зачем вам это нужно. Вместо того, чтобы добавлять мой ответ на ваш вопрос, вы можете просто обсудить его в комментариях здесь, и я изменю свой ответ. - person Mark; 20.07.2013
comment
Ваш новый сценарий в вопросе неверен. Вы объявляете глобальный массив только внутри обработчика mouseUp. Таким образом, обработчик push не знает об этом, пока вы не объявите ту же глобальную переменную в обработчике push. Если вы объявите переменную вне обработчика, все обработчики в скрипте узнают об этом. - person Mark; 20.07.2013