@ivanDoligov

Как правильно склонировать объеты?

Добрый день! Подскажите пожалуйста, как правильно склонировать любое число объектов и прибать id каждого объекта на единицу?

const clonObj = (obj, count) => {
  const objects = [];

  for (let i = 0; i < count; i++) {
    objects.push({ ...obj });
    objects[i].id = objects[i].id + 1;
  }

  return [...objects];
};


использование потом, примерно такое:
const result = clonObj({id: 5}, 10);
должно получиться 10 объектов и id начинаться с 5-ки

В каждом obj есть заранее уже поле id!
если можно, подскажите как правильно это сделать прибавив единицу к каждому следующему id и не использовать цикл for
  • Вопрос задан
  • 174 просмотра
Решения вопроса 2
Seasle
@Seasle Куратор тега JavaScript
Без цикла никак.
const clone = (base, count, key = 'id') => [...new Array(count)].map((_, index) => {
  const cloned = { ...base };
  cloned[key] += index;
  
  return cloned;
});

const a = {
  id: 7,
  type: 'apple'
};
console.log(clone(a, 8));
console.log(a);
/**
[
  { id: 7, type: 'apple' },
  { id: 8, type: 'apple' },
  { id: 9, type: 'apple' },
  { id: 10, type: 'apple' },
  { id: 11, type: 'apple' },
  { id: 12, type: 'apple' },
  { id: 13, type: 'apple' },
  { id: 14, type: 'apple' }
]
{ id: 7, type: 'apple' }
*/
Ответ написан
Комментировать
Wondermarin
@Wondermarin
const cloneObject = (o, count = 1) => {
  const objects = new Array(count).fill(o);

  return objects.map((obj, index) => ({ ...obj, id: obj.id + index }));
};
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Fragster
@Fragster
помогло? отметь решением!
вместо { ...obj } используй JSON.parse(JSON.stringify(obj)), если объекты сложные (их свойства являются также объектами), но без методов или что-нибудь типа https://lodash.com/docs/4.17.15#cloneDeep если есть методы.
Ну а так - использоавние цикла тут логично, просто можно его немного поменять:
for (let i = 0, id = obj.id+1; i < count; i++, id++) {
    const clone = {...JSON.parse(JSON.stringify(obj)), id}
    objects.push(clone);
  }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы