... иногда первый слайд имеет индекс 1, а не 0. Я не уверен, почему это ...
только причина этого в том, что массив, который вы вызываете map
on (posts
в вашем примере), представляет собой массив разреженный без записи с индексом 0. Пример:
const lower = [];
lower[1] = "one";
lower[2] = "two";
console.log(`'lower' has an entry at index 0? ${0 in lower}`);
console.log(`'lower' has an entry at index 1? ${1 in lower}`);
console.log(`'lower' has an entry at index 2? ${2 in lower}`);
console.log(`Mapping it:`);
const upper = lower.map((value, index) => {
console.log(`index = ${index}`);
return value.toUpperCase();
});
console.log(upper);
console.log(`'upper' has an entry at index 0? ${0 in upper}`);
console.log(`'upper' has an entry at index 1? ${1 in upper}`);
console.log(`'upper' has an entry at index 2? ${2 in upper}`);
.as-console-wrapper {
max-height: 100% !important;
}
Вы можете получить разреженный массив, как минимум, тремя способами:
- Вы создали его таким образом (например,
lower
выше в примере выше);или - (вариант # 1.) Вы создали его, используя
map
для массива, который был редок (например, upper
в примере);или - Вы использовали
delete
(или аналогичный) для удаления записи из массива (delete theArray[0];
)
Причина в том, что map
посещает только записи, которые существуют вмассив, он пропускает пробелы в разреженных массивах.Помните, что на уровне спецификации традиционные массивы JavaScript на самом деле не являются массивами ¹ (хотя они часто используются для оптимизации реализации), что означает, что вы можете иметь массив с length
из 3
, нотолько (например) две записи в нем.Это то, что lower
выше (также upper
).Или вы можете иметь еще больше пробелов:
const a = [];
a[3] = "three";
a[5] = "five";
logArray("a", a);
const b = a.map((value, index) => {
console.log(`index = ${index}`);
return value.toUpperCase();
});
logArray("b", b);
function logArray(name, a) {
console.log(`${name}'s length is ${a.length}`);
for (let index = 0; index < a.length; ++index) {
console.log(`${name} has entry at index ${index}? ${index in a}`);
}
}
.as-console-wrapper {
max-height: 100% !important;
}
Там, a
и b
не имеют записей для индексов 0, 1, 2 или 4.
Есливы устанавливаете length
(или используете delete
), у вас тоже могут быть пробелы в конце.
¹ (Это пост в моем маленьком анемичном блоге.)