Как запретить мутирование основного массива js

как сделать, чтобы основной массив store не мутировал?

function bubbleSort(stats) {
  for (let i = 0; i < stats.length - 1; i++) {
    const tmp = stats[i];

    if (stats[i].size > stats[i + 1].size) {
      stats[i] = stats[i + 1];
      stats[i + 1] = tmp;
    }
  }

  return stats;
}

function generateData(arr, order) {
  let stats = [];
  let assignment = [];

  let newArr = [];
  
  for(let i = 0; i< arr.length; i++) {
    newArr.push(arr[i])
  }


  order.filter((orderItem) => {
    newArr.map((sizeItem, index) => {
      const isAvaibleAssigment = assignment.find((assignteItem) => assignteItem.id === orderItem.id);

      if (isAvaibleAssigment) {
        return sizeItem;
      }

      if (orderItem.size.includes(sizeItem.size)) {

        if (sizeItem.quantity === 0) {
          return sizeItem;
        }

        assignment.push({
          id: orderItem.id,
          size: sizeItem.size,
          quantity: 1
        })

        const findedStatIndex = stats.findIndex((itemStat) => itemStat.size === sizeItem.size);

        if (findedStatIndex >= 0) {
          stats[findedStatIndex].quantity++;
        } else {
          stats.push({
            size: sizeItem.size,
            quantity: 1
          })
        }

        sizeItem.quantity--;
      }

      return sizeItem;
    });
  });

  stats = bubbleSort(stats)

  return {
    stats,
    assignment
  };
}


function getData(store, order) {

  if (store.length === 0 || order.length === 0) {
    return false;
  }
  
  const storee = store.values();
  
  const {
    stats,
    assignment
  } = generateData([...storee], order)

  console.log('store', store);


  return {
    stats,
    assignment
  };
}


console.log(getData(
  [{
    size: 1,
    quantity: 2
  }, {
    size: 2,
    quantity: 1
  }],
  [{
    id: 102,
    size: [2]
  }, {
    id: 103,
    size: [1]
  }, {
    id: 104,
    size: [1]
  }]
))

Решение здесь jsfiddle


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

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

Объяснение

Чтобы массив не менялся у нас 2 проблемы.

  1. Запретить изменение массива целиком.
  2. Не дать изменить элементы массива.

Ответы на эти вопросы:

  1. const
  2. Object.freeze()

Решение

Создадим константный массив и заморозим её:

const readOnlyArray = Object.freeze([1, 2, 3]);
console.log(`До изменения: ${readOnlyArray}`);
try {
  readOnlyArray = null; // При попытке изменить константу выскакивает ошибка
} catch (error) {
  console.error(error.message);
}
readOnlyArray[0] = 5; // При попытке изменить элемент ошибки не будет, но и элемент изменить не удастся
console.log(`После изменения: ${readOnlyArray }`);

→ Ссылка