Допустим, у нас есть такой массив:
let list = [
{
name: '1',
count: 0,
},
{
name: '2',
count: 10,
},
{
name: '3',
count: 18,
},
];
Тогда как обновить все предметы, чтобы увеличить count на 1?
Вот несколько решений, в то время как никто из них вполне удовлетворительно:
/* no-restricted-syntax error, pass */
for (const item of list) {
item.count += 1;
}
/* no-param-reassign error, pass */
list.forEach((item) => {
item.count += 1;
});
/*
Object.assign is free to use without error
but it against the intention of no-param-reassign
*/
list.forEach((item) => {
Object.assign(item, { count: item.count + 1 });
});
/*
use Array.map() to replace the original array
but it costs a lot when the item is large or the array has a large length
also ugly code for such a tiny update
*/
list = list.map((item) => ({
...item,
count: item.count + 1,
}));
Если у вас есть лучшее решение или вы считаете, что Array.map() достаточно хорошо, оставьте свое мнение.
Спасибо :)
Являются ли такие правила, как no-param-reassign строгими или личными предпочтениями? Потому что похоже, что вы пытаетесь сделать именно это. Если строго, кажется, что Array.map() — лучшее решение.
@ user1599011 Это строго. Я хочу улучшить свой стиль кода с помощью авторитетного руководства по стилю (и я выбираю стиль JavaScript Airbnb). Это полезно в большинстве условий, но я думаю, что иногда оно чрезмерно оптимизировано.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Обычно я использую обычный цикл for, чтобы избежать проблем с Airbnb lint, как показано ниже:
for (let index = 0; index < list.lenght; index++) {
const item = list[index];
if (item) {
item.count += 1;
}
}
Разве это не нарушит правило «без переназначения параметров»?
Нет, в правиле no-param-reassign упоминается только то, что вы не можете обновлять объект/значение, переданное в качестве параметра функции, например, в функции forEach элемент является параметром функции. Поскольку здесь мы не используем никаких функций, мы не нарушаем правило no-param-reassign.
Попался! И в таком случае это самый простой, самый прямой выбор.
Да, просто и понятно, это хорошо для меня. Пока думаю, не перезаписать ли no-restricted-syntax правило для этой проблемы github.com/airbnb/javascript/issues/2428
Я отправляю новый вопрос об этой проблеме и получаю несколько предложений github.com/airbnb/javascript/issues/2585
Почему нет? список = список.карта (элемент => элемент.количество++)