создавать дубликаты объектов в массив на основе предоставленной длины - PullRequest
0 голосов
/ 12 июня 2019

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

var a = [{displayName: 'bar'}, {displayName:'google'}, {displayName:'mod'}];;
var dataTypesLength= 4;

Вывод должен быть таким:

var a = [{displayName: 'bar'},{displayName: 'bar'},{displayName: 'bar'},{displayName: 'bar'}, {displayName:'google'},{displayName:'google'},{displayName:'google'},{displayName:'google'}, {displayName:'mod'}, {displayName:'mod'}, {displayName:'mod'}, {displayName:'mod'}];

Я пробовал это:

a = a.flatMap( word => Array.from({ dataTypesLength}).fill( word ));

но я получаю сообщение об ошибке: Argument of type '{ dataTypesLength: any; }' is not assignable to parameter of type 'ArrayLike<{}>'. Object literal may only specify known properties, and 'dataTypesLength' does not exist in type 'ArrayLike<{}>'

Ответы [ 4 ]

2 голосов
/ 12 июня 2019

Вы можете использовать это (однострочное решение):

a.reduce((acc,x)=>{ acc.push(...new Array(dataTypesLength).fill(x)); return acc;}, [])

Объяснение:

  • Сокращение входного массива, начиная с пустого массива []
  • Для каждого элемента создайте новый массив с длиной dataTypesLength и заполните весь новый массив текущим элементом new Array (dataTypesLength) .fill (x)
  • Распространение нового созданного массива и вставка его в массив аккумуляторов acc.push (... new Array (dataTypesLength) .fill (x))
  • Вернуть массив аккумуляторов
2 голосов
/ 12 июня 2019

Просто зациклите массив объектов и используйте fill, чтобы получить ваш результат.

var a = [{displayName: 'bar'}, {displayName:'google'}, {displayName:'mod'}];
var dataTypesLength= 4;
var arr=[];
function fillArray(value, len) {
  return Array(len).fill(value);
}
for (var i=0; i<a.length; i++){
  var b = fillArray(a[i],dataTypesLength);
  arr.push(...b);
}
console.log(arr);
2 голосов
/ 12 июня 2019

Вы можете использовать map с Object.assign, чтобы каждый объект имел независимую ссылку

var a = [{displayName: 'bar'}, {displayName:'google'}, {displayName:'mod'}];
var dataTypesLength= 4;

a= a.map(obj => { return Array(dataTypesLength).fill(null).map( e => Object.assign({}, obj)) }).flat();
console.log(a)
0 голосов
/ 12 июня 2019

можно попробовать reduce

var a = [{displayName: 'bar'}, {displayName:'google'}, {displayName:'mod'}];;
var dataTypesLength= 4;

a  = a.reduce(
(f,obj ) => {
var dup = new Array(dataTypesLength); 
f.push(...dup.fill(obj));
return f;
}, [] )
...