JavaScript, объединяющий параметр функции с существующей переменной - PullRequest
0 голосов
/ 26 ноября 2018

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

Пример: я создаю 31 дверь, которая открыта или закрыта.Итак, у меня есть:

var door1State = 0;
var door2State = 0;
...
var door31State = 0;

Мой вопрос, возможно ли создать функцию, в которой я передаю номер двери в качестве параметра, например:

function openDoor(doorNumber) {
   door+doorNumber+State = 1;
}

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

Надеюсь, мое объяснение понятно, если нет, я с удовольствием уточню еще немного.

Заранее спасибо!

РЕДАКТИРОВАТЬ: Спасибо за все полезные ответыУ меня есть следующий вопрос по этому вопросу.Я работаю с Blippar, и у них есть API, который работает довольно легко, но теперь мне нужно анимировать двери, чтобы открыть.Сначала я объявил «спрайтов» в «сцене», а затем мне нужно анимировать определенные части

deur1.onTouchEnd = function() {
if (door1Openable == 1) {
  deur1.animate().rotationY(180).scale(600,360).translation(0,0,95).duration(1000);
  deur1text.animate().rotationY(0).scale(600,360).translation(0,0,100).duration(1000);

  setTimeout(function(){
    door1State = 1;
  }, 1500);
} else {
  return false;
}

Это происходит 31 раз для 31 двери.Мой вопрос: как было бы проще преобразовать это в функцию с параметрами?Единственными обязательными параметрами являются «номер двери», «позиция x» и «позиция y».

Я пробовал что-то подобное, что, очевидно, не сработало, но мне трудно найти правильныйспособ сделать это.

function() openDoor(doorNumber,xPos,yPos) {
if ('door'+doorNumber+'Openable' == 1) {
  'deur'+doorNumber.animate().rotationY(180).scale(600,360).translation(xPos,yPos,95).duration(1000);
  'deur'+doorNumber+'text'.animate().rotationY(0).scale(600,360).translation(xPos,yPos,100).duration(1000);

  setTimeout(function(){
    'door'+doorNumber+'Openable' = 1;
  }, 1500);
} else {
  return false;
}

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

РЕДАКТИРОВАТЬ 2: API непринять окно [] по некоторым причинам, оно запускается в приложении.

Ответы [ 4 ]

0 голосов
/ 26 ноября 2018

Да, это возможно.

function openDoor(number) {
  window['door'+number+'State'] = 1;
}

for (var i = 1; i <= 31; i++) {
  window['door'+i+'State'] = 0;
}

openDoor(2)
console.log(door2State)

Для этого вы также можете использовать массив:

var doors = [
   0,0,0,0,0,0,...0 // to 31 0s
];

Затем укажите door1State с использованием door [0]

0 голосов
/ 26 ноября 2018

Это возможно, если вы измените переменные door#State на отдельный объект вместо 31 отдельной переменной.Затем вы можете просто использовать скобочные обозначения для поиска правильного объекта.:

const doorStates = { door1State: 0, door2State: 0, ... };
function openDoor(doorNumber) {
  doorStates['door' + doorNumber + 'state'] = 1;
}

Или вы можете вместо этого использовать массив:

// Create an array of length 31, all elements are 0:
const doorStates = Array.from({ length: 31 }, () => 0);

function openDoor(doorNumber) {
  // arrays are zero-indexed
  doorStates[doorNumber - 1] = 1;
}
0 голосов
/ 26 ноября 2018

Вы можете попытаться составить словарь дверей.Кажется, что ваше использование может заслуживать использования словаря вместо нескольких переменных.Вот пример:

list_dict = {};
function(doorname)
{
    this.list_dict[doorname] = 0;
}   

Вы также можете прочитать немного о картах здесь: Карты Javascript

0 голосов
/ 26 ноября 2018

Попробуйте использовать массив, содержащий ваше состояние

const Doors=[
{
  id:1,
  isOpen:true,
},
{
  id:2,
  isOpen:true,
},
{
  id:3,
  isOpen:false,
}
//..etc
]

это гораздо проще обрабатывать и манипулировать, чем огромное количество переменных.

Чтобы открыть дверь, вы можете сделать что-то вроде этого:

const OpenDoor=(doorNumber)=>{
Doors.forEach(function(door, index) {
  if(door.id===doorNumber)
    Doors[index].isOpen = true;  
});
}

, а затем OpenDoor(3);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...