将数组与一周中的天数向后移动一天js



我有这样的代码

const weekDays = [
{ label: 'Mon', name: 'Monday' },
{ label: 'Tue', name: 'Tuesday' },
{ label: 'Wed', name: 'Wednesday' },
{ label: 'Thu', name: 'Thursday' },
{ label: 'Fri', name: 'Friday' },
{ label: 'Sat', name: 'Saturday' },
{ label: 'Sun', name: 'Sunday' },
];
let daysOfWeek = ['Tue','Thu', 'Sun']
const firstDayIndex = weekDays.findIndex(day => day.label === daysOfWeek[0]) // get current day index
daysOfWeek.unshift(weekDays[(firstDayIndex || weekDays.length) - 1].label) // add previous day by index
daysOfWeek.pop() // remove last day
console.log(daysOfWeek)

现在,daysOfWeek显示["Mon", "Tue", "Thu"],但我希望DaysOf周显示["Mon", "Wed", "Sat"],我的意思是,对于daysOfWeek的每一项,都是向后一天

您可以实现一个循环的双链表,这里通过label在对象中进行索引。

const weekDays = [{ label: 'Mon', name: 'Monday' }, { label: 'Tue', name: 'Tuesday' }, { label: 'Wed', name: 'Wednesday' }, { label: 'Thu', name: 'Thursday' }, { label: 'Fri', name: 'Friday' },{ label: 'Sat', name: 'Saturday' },{ label: 'Sun', name: 'Sunday' }];
const days_list = weekDays
.map((day) => ({ day, prev: null, next: null }))
.reduce((list, node, idx, arr) => {
node.next = arr[(idx + 1) % arr.length];
node.prev = arr[(idx + arr.length - 1) % arr.length];
list[node.day.label] = node;
return list;
}, {});
const daysOfWeek = ['Tue', 'Thu', 'Sun'];
const prevDays = daysOfWeek.map((label) => days_list[label].prev.day.label);
console.log(...prevDays); // Mon Wed Sat
const nextDays = daysOfWeek.map((label) => days_list[label].next.day.label);
console.log(...nextDays); // Wed Fri Mon
// update daysOfWeek
daysOfWeek.forEach((label, i) => (daysOfWeek[i] = days_list[label].prev.day.label));
console.log('updated daysOfWeek: ', ...daysOfWeek);

正如评论中所指出的,使用额外的两个循环来生成列表并不是特别有效,即使结果使用起来很方便。另一种选择是声明实用程序函数,以便为下一天/前一天提供一个标签。

function next_day(label) {
let index = weekDays.findIndex((day) => day.label === label);
if (index === -1) throw `'${label}' is not a valid day label`;
index = index === weekDays.length - 1 ? 0 : index;
return weekDays[index + 1];
}
function prev_day(label) {
let index = weekDays.findIndex((day) => day.label === label);
if (index === -1) throw `'${label}' is not a valid day label`;
index = index === 0 ? weekDays.length : index;
return weekDays[index - 1];
}

const weekDays = [{ label: 'Mon', name: 'Monday' }, { label: 'Tue', name: 'Tuesday' }, { label: 'Wed', name: 'Wednesday' }, { label: 'Thu', name: 'Thursday' }, { label: 'Fri', name: 'Friday' },{ label: 'Sat', name: 'Saturday' },{ label: 'Sun', name: 'Sunday' }];
function next_day(label) {
let index = weekDays.findIndex((day) => day.label === label);
if (index === -1) throw `'${label}' is not a valid day label`;
index = index === weekDays.length - 1 ? 0 : index;
return weekDays[index + 1];
}
function prev_day(label) {
let index = weekDays.findIndex((day) => day.label === label);
if (index === -1) throw `'${label}' is not a valid day label`;
index = index === 0 ? weekDays.length : index;
return weekDays[index - 1];
}
const daysOfWeek = ['Tue', 'Thu', 'Sun'];
const prevDays = daysOfWeek.map((day) => prev_day(day).label);
console.log('prevDays: ', ...prevDays); // Mon Wed Sat
const nextDays = daysOfWeek.map((day) => next_day(day).label);
console.log('nextDays: ', ...nextDays); // Wed Fri Mon
// or change daysOfWeek in place
daysOfWeek.forEach((day, i) => (daysOfWeek[i] = prev_day(day).label));
console.log('updated daysOfWeek: ', ...daysOfWeek);

这两个函数共享大量逻辑,可以很容易地组合成一个offset_day实用函数,该函数接受offset以从已传递的日期标签返回天+n-n,如果偏移量被省略、0或可被weekDays.length整除,则返回已传递标签的日期对象。

function offset_day(label, offset = 0) {
let index = weekDays.findIndex((day) => day.label === label);
if (index === -1) throw `'${label}' is not a valid day label`;
const length = weekDays.length;
const _offset = offset % length;
if (_offset) {
index = index + _offset;
index = index < 0 ? index + length : index >= length ? index - length : index;
}
return weekDays[index];
}

const weekDays = [{ label: 'Mon', name: 'Monday' }, { label: 'Tue', name: 'Tuesday' }, { label: 'Wed', name: 'Wednesday' }, { label: 'Thu', name: 'Thursday' }, { label: 'Fri', name: 'Friday' },{ label: 'Sat', name: 'Saturday' },{ label: 'Sun', name: 'Sunday' }];
function offset_day(label, offset = 0) {
let index = weekDays.findIndex((day) => day.label === label);
if (index === -1) throw `'${label}' is not a valid day label`;
const length = weekDays.length;
const _offset = offset % length;
if (_offset) {
index = index + _offset;
index = index < 0 ? index + length : index >= length ? index - length : index;
}
return weekDays[index];
}
const daysOfWeek = ['Tue', 'Thu', 'Sun'];
const prevDays = daysOfWeek.map((day) => offset_day(day, -1).label);
console.log('prevDays: ', ...prevDays); // Mon Wed Sat
const nextDays = daysOfWeek.map((day) => offset_day(day, 1).label);
console.log('nextDays: ', ...nextDays); // Wed Fri Mon
// offset by 'n' days either way
const minusThree = daysOfWeek.map((day) => offset_day(day, -3).label);
console.log('minusThree: ', ...minusThree); // Sat Mon Thur
const plusThree = daysOfWeek.map((day) => offset_day(day, 3).label);
console.log('plusThree: ', ...plusThree); // Fri Sun Wed

只需循环daysOfWeek并在weekDays中找到其发生索引。使用weekDays中的索引引用更新daysOfWeek中的节点

前一天工作涂鸦

const weekDays = [{ label: 'Mon', name: 'Monday' }, { label: 'Tue', name: 'Tuesday' }, { label: 'Wed', name: 'Wednesday' }, { label: 'Thu', name: 'Thursday' }, { label: 'Fri', name: 'Friday' },{ label: 'Sat', name: 'Saturday' },{ label: 'Sun', name: 'Sunday' }];
const daysOfWeek = ['Tue', 'Thu', 'Sun'];
// const daysOfWeek = ['Mon', 'Tue', 'Sun'];
daysOfWeek.forEach((day, dayIndex) => {
let index = weekDays.findIndex(item => item.label === day);
index = index === 0 ? weekDays.length : index;
index !== -1 ? daysOfWeek[dayIndex] = weekDays[index - 1].label : null;
});
console.log(daysOfWeek);

次日工作逻辑

const weekDays = [{ label: 'Mon', name: 'Monday' },{ label: 'Tue', name: 'Tuesday' },{ label: 'Wed', name: 'Wednesday' },{ label: 'Thu', name: 'Thursday' },{ label: 'Fri', name: 'Friday' },{ label: 'Sat', name: 'Saturday' },{ label: 'Sun', name: 'Sunday' }];
let daysOfWeek = ['Tue', 'Thu', 'Sun'];
// let daysOfWeek = ['Mon', 'Tue', 'Sat'];
daysOfWeek.forEach((day, dayIndex) => {
let index = weekDays.findIndex(item => item.label === day);
// index = index === 0 ? weekDays.length : index;
if (index !== -1) {
index = index === weekDays.length - 1 ? -1 : index;
daysOfWeek[dayIndex] = weekDays[index + 1].label;
}
});
console.log(daysOfWeek);