我在想把一个元素插入到列表中的最好方法.
我想出了几种方法:
// setup
let messages = Array.from({ length: 1e5 }, (_, index) => ({ text: `text for message ${index + 1}` }));
第一次测试不会克隆原始列表.
const prependMessage1 = () => {
messages = [{ text:'test message 1' }, ...messages];
};
prependMessage1();
// 531 ops/s ± 4.61%
// 99.5 % slower
const prependMessage2 = () => {
messages = [{ text:'test message 2' }].concat(messages);
};
prependMessage2();
// 5.6K ops/s ± 1.49%
// 94.71 % slower
const prependMessage3 = () => {
messages.unshift({ text: 'text message 3' })
};
prependMessage3();
// 105K ops/s ± 1.25%
// Fastest ✅
const prependMessage4 = () => {
messages.reverse();
messages.push({ text: 'text message 4' });
messages.reverse();
};
prependMessage4();
// 4.9K ops/s ± 1.08%
// 95.3 % slower
我在我的应用中使用了一个状态管理器,它不允许直接改变状态.每个方法都应该返回一个新对象,而不是改变当前的消息列表.现在有趣的是,一旦我开始克隆,这些结果就会改变:
const prependMessage1 = () => {
const copy = [...messages];
messages = [{ text:'test message 1' }, ...copy];
};
prependMessage1();
// 472 ops/s ± 3.19%
// 84.57 % slower
const prependMessage2 = () => {
const copy = [...messages];
messages = [{ text:'test message 2' }].concat(copy);
};
prependMessage2();
// 3.1K ops/s ± 1.09%
// Fastest ✅
const prependMessage3 = () => {
const copy = [...messages];
copy.unshift({ text: 'text message 3' })
messages = copy;
};
prependMessage3();
// 2.5K ops/s ± 2.28%
// 19.7 % slower
const prependMessage4 = () => {
const copy = [...messages];
copy.reverse();
copy.push({ text: 'text message 4' });
copy.reverse();
messages = copy;
};
prependMessage4();
// 1.2K ops/s ± 1.11%
// 61.14 % slower
根据这些测试,是否可以安全地假设我应该使用concat
?随着名单的增长,这里似乎有concat
场胜利.或者我还遗漏了另一种最佳方式?