我建立了一个商店,其中包含从我的API加载的游乐设施列表:
const loadRides = () => client.service('rides').find({
query: {
$sort: {
date: -1,
}
}
});
const createRides = () => {
const { subscribe, update } = writable([], async (set) => {
try {
const rides = await loadRides().then((result) => result.data);
set(rides);
} catch (e) {
console.error(e);
}
// Socket update binding?
});
subscribe((rides) => console.debug('rides', rides));
return {
subscribe,
refresh: () => loadRides().then((result) => update(() => result.data)),
};
};
export const rides = createRides();
然后,我为过去和将来的游乐设施设置了两个派生商店:
export const pastRides = derived(
rides,
($rides) => $rides
.filter((ride) => ride.steps.every((step) => step.doneAt))
,
);
export const comingRides = derived(
rides,
($rides) => $rides
.filter((ride) => ride.steps.some((step) => !step.doneAt))
.sort((rideA, rideB) => {
const compare = new Date(rideA.date) - new Date(rideB.date);
console.log(rideA.date, rideB.date, compare);
return compare;
})
,
);
第二个方法上的sort
方法没有任何作用。
因此,我尝试将此方法放在filter
之前。它可以工作,但也可以对$pastRides
进行排序。实际上,它正在对完整的$rides
数组进行排序,并且很有意义。
但是我不明白为什么sort
之后的filter
不起作用。
我想念什么?
答案 0 :(得分:0)
Array.sort
是可变的。这意味着,当您调用rides.sort
时,它将对rides
进行排序和修改,并返回排序后的rides
。
使用derived(rides, ($rides) => ... )
时,收到的$rides
是调用rides
的原始set(rides)
数组。因此,您可以想象pastRides
和comingRides
都接收到相同的$rides
数组。
您可以在this repl
中观察到这种行为要不让两个derived
互相干扰,可以创建一个新数组并对新数组进行排序:
const sorted_1 = derived(array, $a => [...$a].sort());
您可以在this repl中进行尝试。