Создание нового массива, содержащего истинные копии элементов другого массива несколько раз через Google Script - PullRequest
1 голос
/ 23 октября 2019

У меня возникли проблемы с созданием нового массива, который несколько раз повторяет несколько элементов другого массива через Google Apps Script.

Например, массив, с которого я начинаю, выглядит следующим образом:

var sourceArray = [
                   [['A', 1], ['B', 1]]
                  ]

Я хотел бы иметь возможность создать новый массив, который повторяет элементы, которые массив X число раз. Скажем, если я захочу повторить эти элементы 3 раза, я получу следующий новый массив в результате:

var newArray = [
                [['A', 1], ['B', 1]],
                [['A', 1], ['B', 1]],
                [['A', 1], ['B', 1]]
               ]

Я смог сделать это, используя следующую функцию, найденную здесь в StackOverFlow:

function mutateArray(arr,n){
  var temp = [];
  while(n--) Array.prototype.push.apply(temp,arr);
  return temp;
}

После того, как я запустил эту функцию следующим образом, я получил «newArray», описанный выше:

mutateArray(sourceArray,3);

Однако, хотя эта функция и создала новый массив, содержащий элементы sourceArray3 раза я столкнулся с проблемой: я не могу вносить изменения в элементы newArray индивидуально. Для иллюстрации, если я попытаюсь изменить первый ['A', 1] на ['A', 2] следующим образом ...

newArray[0][0][1] = 2;

... это изменит не только первый ['A', 1], но все из них.

Исходя из того, что я мог понять, проблема в том, что при создании newArray используемый мной метод создавал не три разных подмассива с одинаковыми значениями, а три ссылки на одно и то же. массив. Так что это мой вопрос: как я могу создать с помощью Google Apps Script новый массив, который повторяет несколько элементов другого массива несколько раз, убедившись, что этот новый массив содержит истинных копий из (не только ссылается на)исходный массив.

1 Ответ

0 голосов
/ 23 октября 2019

Вам нужно будет сделать глубокую копию (вложенного) массива. Пока ваши массивы содержат только примитивные типы (т. Е. Строки, числа, логические значения) и / или литералы объектов, состоящие из примитивных типов, вы должны иметь возможность JSON.stringify() массив и затем JSON.parse() массив, чтобы сделать глубокую копиюиз этого.

Что-то вроде:

var deepCopy = JSON.parse(JSON.stringify(arr));

Затем вы можете вызывать функцию apply с массивом deepCopy вместо переменной arr.

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