Скопируйте массивы как отдельные элементы в другой массив в JavaScript - PullRequest
0 голосов
/ 21 января 2019

EDIT:

var G = require('generatorics');
var newArray = [];
   for (var data of G.permutation(['a', 'b'])) {
      console.log(data);

      //this returns an array in every iteration as below
      //data = ['a', 'b'] //iteration 1
      //data = ['b', 'a'] //iteration 2
      //data = ['b', 'b'] //iteration 3 
      //data = ['a', 'a'] //iteration 4

Я хочу добавить эти массивы данных в виде отдельных массивов в newArray, объявленный в верхней части каждой итерации.Ниже приведена нотация спреда, в которой все элементы добавлены, но все они входят в качестве отдельных элементов.

newArray.push(...data);
    }

Я ищу что-то подобное в качестве конечного результата.

newArray = [['a', 'b'], ['c', 'd'], ['e', 'f']];

Любойпредложения?

Ответы [ 4 ]

0 голосов
/ 21 января 2019

Звучит так, как будто вы хотите копий массивов, а не ссылок на один и тот же массив.Вы можете смешать map и [...] или slice(), чтобы добавить копию, а не просто ссылку на элемент в новый массив:

let something = [['a', 'b'], ['c', 'd'], ['e', 'f']]

let newArray = something.map(item => [...item]) // copy of each array

console.log(newArray)

// not the same references
console.log(newArray[0] === something[0])

РЕДАКТИРОВАТЬ:

Если something является итератором, а не массивом, вы все равно можете сделать почти то же самое, просто используя цикл for:

// Some iterator from a library //
let arr = [['a', 'b'], ['c', 'd'], ['e', 'f']]
function* gen() {
    yield*  arr
}
let something = gen()
/////////////////////////////

// Array.from can iterate the iteraor
let newArray = Array.from(something, (data) => [...data])

console.log(newArray)
console.log(newArray[0] === arr[0])

Редактировать II:

Это прекрасно работает для меня (в основном то же, что и выше):

// var G = require('generatorics'); // loading with script
var newArray = Array.from(G.permutation(['a', 'b']), (data) => [...data]);
console.log(newArray)
<script src="https://cdn.jsdelivr.net/npm/generatorics@1.1.0/generatorics.js"></script>
0 голосов
/ 21 января 2019

Вы можете сделать копию с картой ...

let newArray = something.map(data => data);

Или с ломтиком ...

let newArray = something.slice();

Или кучей других способов .

0 голосов
/ 21 января 2019

Вы упомянули, что хотите скопировать массивы в newArray? Если вы хотите скопировать массивы, а не просто вставить ссылку на них в newArray, вам нужно использовать .slice.

Итак: newArray.push(data.slice());

Имейте в виду, что .slice создает неглубокую копию, а не глубокую копию, поэтому любые вложенные объекты будут по-прежнему ссылками, но будут скопированы примитивы (например, целые числа и строки).

0 голосов
/ 21 января 2019

Просто удалите спред (...), чтобы вы каждый раз нажимали массив data:

newArray.push(data);

Демонстрация:

var newArray = [];

var something = [['a', 'b'], ['c', 'd'], ['e', 'f']];

for (var data of something ){
  newArray.push(data);
}

console.log(newArray);

Или, если вы хотите сделать его еще более компактным, полностью удалите петлю for...of и просто используйте map:

var newArray = [];

var something = [['a', 'b'], ['c', 'd'], ['e', 'f']];

newArray = something.map(data => data);

console.log(newArray);

Или, так как вы делаете один массив таким же, как другой, просто присвойте их так:

var something = [['a', 'b'], ['c', 'd'], ['e', 'f']];

var newArray = something;

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