Как добавить в массив с элементами, элемент, N раз, на тоже самое место где и был первоначально этот элемент?

selectedProducts: [...state.selectedProducts.filter((el) => el.id !== data.payload[0].id), ...data.payload]

selectedProducts - это массив с элементами, data.payload - это массив с нужным элементом длинной N пробовал вот так


Ответы (1 шт):

Автор решения: SwaD

Как я понял, вы работаете с отсортированным массивом объектов и вам необходимо "разнообразное" поведение, то его можно реализовать следующим образом:

/**
 * @typedef {Object} Element
 * @property {number} id
 * @property {string} name
 */
/** @type Element[] */
const datas = [{ id: 0, name: '0'}, {id: 1, name: '1'},
  { id: 2, name: '2'}, {id: 3, name: '3'},
  { id: 4, name: '4'}, {id: 5, name: '5'},];
/** @param {Element[]} data
  * @param {Element[]} inc 
 */
function insert(data, inc) {
  if (inc.length === 1) { // Если элемент 1 меняем местами
    const idx = data.findIndex(item => item.id === inc[0].id);
    if (idx !== -1) data[idx] = inc[0];
    // Тут вам надо описать поведение, если элемент не найден
    return data;
  } else {
    // Если передали сразу несколько элементов
    function sorts(a, b) {
      if (a.id > b.id) return 1;
      if (a.id < b.id) return -1;
      return 0;
    }
    const ids = inc.map(item => item.id);
    // Отдельно сюда добавьте, при необходимости проверки
    const dataset = data.filter(item => {
      return !ids.includes(item.id);
    })
    // И сюда тоже можно проверок добавить.
    if (dataset.length !== data.length) {
      // Вставляем новые элементы
      inc.forEach(item => dataset.push(item));
      // Сортируем
      return dataset.sort(sorts);
    }
  }
}

console.log(insert(datas, [{id: 1, name: '11'}]));
console.log(insert(datas, [{id: 1, name: '11'}, {id: 4, name: '44'}]));

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

→ Ссылка