Хранение имен переменных в массиве - PullRequest
0 голосов
/ 25 марта 2020

У меня есть четыре переменные, и я хочу изменить их значения, используя функцию, в которую я просто могу поместить массив, хранящий переменные. Я делаю игру, в которой используется система координат, и поэтому у меня есть четыре координаты, которые я хочу постоянно обновлять с помощью оси Y и оси X. У меня есть один массив, yAxis, со всеми значениями y и один массив, xAxis, со всеми значениями x. Я хочу объединить их в координаты. Конечно, я могу обновить их, используя следующий код:

yAxis = [10, 10, 9, 9];
xAxis = [4, 4, 5, 5];

coordinate1 = "" + yAxis[0] + xAxis[0];
coordinate2 = "" + yAxis[1] + xAxis[1];
coordinate3 = "" + yAxis[2] + xAxis[2];
coordinate4 = "" + yAxis[3] + xAxis[3];

Но вместо того, чтобы изменять их значения, как раньше, я хотел бы сделать что-то вроде этого: Эта функция будет принимать массив ниже, координирующий массив как yAxis как b и xAxis как c. Тогда х это просто целое число.

test(a, b, c){
  for(x = 0; x < 4; x++){
    a[x] = "" + b[x] + c[x];
  }
}

, а затем я бы назвал эту функцию следующим образом:

coordinatesArray = [coordinate1, coordinate2, coordinate3, coordinate4];
test(coordinatesArray, yAxis, xAxis);

Что тогда делать с любым массивом, с которым я запускаю функцию теста:

coordinatesArray[0] = "" + yAxis[0] + xAxis[0];
coordinatesArray[1] = "" + yAxis[1] + xAxis[1];
coordinatesArray[2] = "" + yAxis[2] + xAxis[2];
coordinatesArray[3] = "" + yAxis[3] + xAxis[3];

И, например, coordinatesArray[0] должен затем представлять coordinate1.

Таким образом, я бы создал массив для хранения переменных, чтобы я мог легко изменить, какая переменная должна быть целевой. Проблема, однако, когда я запускаю это, [x] - это не имя переменной, а их значения, что означает, что это не работает. Итак, мой вопрос, есть ли способ сохранить имена переменных в массиве, чтобы я мог нацелить их, используя функцию, аналогичную той, которую я показал? Я хочу сохранить имена переменных в массиве, а затем иметь возможность использовать имя для назначения переменной, чтобы я мог изменить их значения.

Ответы [ 3 ]

1 голос
/ 25 марта 2020

Массивы в Javascript имеют только индексы, а не имена, поэтому вам нужен объект:

yAxis = [10, 10, 9, 9];
xAxis = [4, 4, 5, 5];
coordinatesArray = ['coordinate1', 'coordinate2', 'coordinate3', 'coordinate4'];

function test(a, b, c){
    let arrOfObj = [];
    for(let i=0; i < a.length; i++){
        let obj = {};    
        obj[a[i]] = [b[i], c[i]];
        arrOfObj.push(obj);
    }
    return arrOfObj;
}

console.log(test(coordinatesArray,yAxis,xAxis));
0 голосов
/ 26 марта 2020

Для меня это выглядит так, будто ОП запрашивает хранилище значений ключей на основе простого объекта. Но, возможно, я ошибся.

Таким образом, ответ сначала фокусируется на том, как сгенерировать список объединенных пар координат xy, что, на мой взгляд, является наиболее прагматичным c подходом ...

const yAxis = [10, 10, 9, 9];
const xAxis = [4, 4, 5, 5];

const coordinatesList = yAxis.map((y, idx) => `${ y }${ xAxis[idx] }`);

console.log('(...coordinatesList) =>', coordinatesList);
.as-console-wrapper { max-height: 100%!important; top: 0; }

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

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

function concatinateCorrespondingBoundArrayItem(partial, idx) {
  return [partial, this[idx]].join('');
}
const yAxis = [10, 10, 9, 9];
const xAxis = [4, 4, 5, 5];

const [
  foo,
  bar,
  baz,
  biz
] = yAxis.map(concatinateCorrespondingBoundArrayItem, xAxis);

console.log('foo bar baz biz :', foo, bar, baz, biz);
.as-console-wrapper { max-height: 100%!important; top: 0; }

Наконец, хранилище, которое, возможно, запрашивал OP, должно основываться на объектах / картах. Возможный подход мог бы тогда выглядеть похожим на этот последний предоставленный пример ...

function createCoordinateRecord(collector, coordinateName, idx) {
  collector.storage[coordinateName] = [
    collector.yCoordList[idx],
    collector.xCoordList[idx]
  ].join('');
  return collector;
}
const yAxis = [10, 10, 9, 9];
const xAxis = [4, 4, 5, 5];

const coordinateNameList = ['foo', 'bar', 'baz', 'biz']

const coordinatesMap = coordinateNameList.reduce(createCoordinateRecord, {

  xCoordList: xAxis,
  yCoordList: yAxis,
  storage: {}

}).storage;

console.log('coordinatesMap :', coordinatesMap);

console.log('coordinatesMap.foo :', coordinatesMap.foo);
console.log('coordinatesMap.bar :', coordinatesMap.bar);
console.log('coordinatesMap[coordinateNameList[2]] :', coordinatesMap[coordinateNameList[2]]);
console.log('coordinatesMap[coordinateNameList[3]] :', coordinatesMap[coordinateNameList[3]]);

console.log('Object.keys(coordinatesMap) :', Object.keys(coordinatesMap));
console.log('Object.values(coordinatesMap) :', Object.values(coordinatesMap));
console.log('Object.entries(coordinatesMap) :', Object.entries(coordinatesMap));
.as-console-wrapper { max-height: 100%!important; top: 0; }
0 голосов
/ 25 марта 2020

Так вот что вы пытаетесь сделать ...

yAxis = [10, 10, 9, 9];
xAxis = [4, 4, 5, 5];

coordinate1 = "magic";
coordinate2 = "will";
coordinate3 = "happen";
coordinate4 = "here";

function test(a, b, c) {
  for(x = 0; x < 4; x++){
    window[a[x]] = "" + b[x] + c[x];
  }
}

function log(a) {
  let output = [];
  for(x = 0; x < 4; x++){
    output.push(window[a[x]]);
  }
  console.log(output);
};

coordinatesArray = ["coordinate1", "coordinate2", "coordinate3", "coordinate4"];

log(coordinatesArray);
test(coordinatesArray, xAxis, yAxis);
log(coordinatesArray);

... но комментарии в вашем вопросе пытаются сказать, что вам не нужны переменные coordinate1, coordinate2 et c, вы можете просто ВСЕГДА используйте один массив, например:

yAxis = [10, 10, 9, 9];
xAxis = [4, 4, 5, 5];

coordinatesArray = ["magic", "will", "happen", "here"];

function test(a, b, c) {
  for(x = 0; x < 4; x++){
    a[x] = "" + b[x] + c[x];
  }
}

console.log(coordinatesArray);
test(coordinatesArray, xAxis, yAxis);
console.log(coordinatesArray);

верно?

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