如何更改存储在 firebase 中的数据的顺序?
How can I alter the order of the data stored in firebase?
目前我正在使用此代码段在我的 firebase 数据库中设置 6 天和每天的一些时间段。
fb.$set({
monday: {
name: 'Monday',
slots: {
900: {
time: '9:00am',
booked: false
},
0110: {
time: '11:00am',
booked: false
},
100: {
time: '1:00pm',
booked: false
},
300: {
time: '3:00pm',
booked: false
},
500: {
time: '5:00pm',
booked: false
},
700: {
time: '7:00pm',
booked: false
}
}
},
tuesday: {
name: 'Tuesday',
slots: {
900: {
time: '9:00am',
booked: false
},
0110: {
time: '11:00am',
booked: false
},
100: {
time: '1:00pm',
booked: false
},
300: {
time: '3:00pm',
booked: false
},
500: {
time: '5:00pm',
booked: false
},
700: {
time: '7:00pm',
booked: false
}
}
},
wednesday: {
name: 'Wednesday',
slots: {
900: {
time: '9:00am',
booked: false
},
0110: {
time: '11:00am',
booked: false
},
100: {
time: '1:00pm',
booked: false
},
300: {
time: '3:00pm',
booked: false
},
500: {
time: '5:00pm',
booked: false
},
700: {
time: '7:00pm',
booked: false
}
}
},
thursday: {
name: 'Thursday',
slots: {
900: {
time: '9:00am',
booked: false
},
0110: {
time: '11:00am',
booked: false
},
100: {
time: '1:00pm',
booked: false
},
300: {
time: '3:00pm',
booked: false
},
500: {
time: '5:00pm',
booked: false
},
700: {
time: '7:00pm',
booked: false
}
}
},
friday: {
name: 'Friday',
slots: {
900: {
time: '9:00am',
booked: false
},
0110: {
time: '11:00am',
booked: false
},
100: {
time: '1:00pm',
booked: false
},
300: {
time: '3:00pm',
booked: false
},
500: {
time: '5:00pm',
booked: false
},
700: {
time: '7:00pm',
booked: false
}
}
},
saturday: {
name: 'Saturday',
slots: {
900: {
time: '9:00am',
booked: false
},
0110: {
time: '11:00am',
booked: false
},
100: {
time: '1:00pm',
booked: false
},
300: {
time: '3:00pm',
booked: false
},
500: {
time: '5:00pm',
booked: false
},
700: {
time: '7:00pm',
booked: false
}
}
}
});
注意顺序。为什么它按字母顺序存储?
当我 return 此数据并在页面上对其进行迭代时,这会成为一个问题,因为日期不是您期望的顺序,而是 return 字母顺序。
有什么办法可以在一定程度上控制它吗?
您需要将函数传递给将执行自定义排序的 orderBy 过滤器。
var myApp = angular.module('myApp',[]);
function MyCtrl($scope) {
$scope.name = 'Superhero';
$scope.days = [
{ name: 'Monday' },
{ name: 'Tuesday' },
{ name: 'Wednesday' },
{ name: 'Thursday' },
{ name: 'Friday' },
{ name: 'Saturday' },
{ name: 'Sunday' }
]
$scope.sortByWeekday = function (day) {
var weekdays = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'];
return weekdays.indexOf(day.name.toLowerCase());
}
}
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
</head>
<body ng-app="myApp">
<div ng-controller="MyCtrl">
<div ng-repeat="day in days | orderBy:sortByWeekday">{{day.name}}</div>
</div>
</body
</html>
我认为您正在寻找 $priority。在 firebase 中排序数据首先由 $priority 完成,其次由 key 完成。 Firebase 中有大量关于 how sorting works 的文档,阅读起来会很好。如果您尝试以预先确定的顺序专门存储数据(并取回数据),我会使用 $priority。
Firebase 数据库存储 JSON 数据。 JSON 对象中的键本质上是无序的。在大多数情况下,Firebase SDK 默认会 return 按字母顺序排列的键。
一般来说,Firebase 建议不要使用数组,但如果这种情况不符合一般建议,您可以这样做:
set({
1: {
name: 'Monday',
slots: {
900: { time: '9:00am', booked: false },
1100: { time: '11:00am', booked: false },
1300: { time: '1:00pm', booked: false },
1500: { time: '3:00pm', booked: false },
1700: { time: '5:00pm', booked: false },
1900: { time: '7:00pm', booked: false }
}
},
2: {
name: 'Tuesday',
slots: {
900: { time: '9:00am', booked: false },
1100: { time: '11:00am', booked: false },
1300: { time: '1:00pm', booked: false },
1500: { time: '3:00pm', booked: false },
1700: { time: '5:00pm', booked: false },
1900: { time: '7:00pm', booked: false }
}
},
3: {
name: 'Wednesday',
slots: {
...
在上面的代码片段中,我还更改了 slots
的键。通过使用 24 小时制时间,它们将按照您希望的方式自动排序。
我在上面发表了评论,在不知道项目范围的情况下很难知道推荐的确切方向。但是,使用日期名称作为键并将时间存储为字符串可能不会长期有效。
简单的答案是将时间slot/event的日期和时间存储为时间戳,格式如YYYYmmddHHMMSS,作为槽的子节点。
例如
training_classes
training_id_1234
timestamp: 20151031130000
trainer: trainer_id1234
client: client_id1234
comment: "Algebra 1"
training_id_3445
timestamp: 20151031150000
trainer: trainer_id1234
client: client_id1234
comment: "Algebra 2"
使用此结构,您可以轻松查询 10 月 31 日星期六的所有 类。在上面的例子中有两个,一个在下午 1 点,一个在下午 3 点。
其他时间没有数据,因此可以在 firebase 中预订(无需存储 booked:false)。
您还可以轻松地对它们进行排序,因为时间戳始终按时间顺序排列 - 它存储在 Firebase 中的顺序无关紧要。
此外,它使更改训练项目变得非常容易。只需更新时间戳和 whammo,它已重新安排。
目前我正在使用此代码段在我的 firebase 数据库中设置 6 天和每天的一些时间段。
fb.$set({
monday: {
name: 'Monday',
slots: {
900: {
time: '9:00am',
booked: false
},
0110: {
time: '11:00am',
booked: false
},
100: {
time: '1:00pm',
booked: false
},
300: {
time: '3:00pm',
booked: false
},
500: {
time: '5:00pm',
booked: false
},
700: {
time: '7:00pm',
booked: false
}
}
},
tuesday: {
name: 'Tuesday',
slots: {
900: {
time: '9:00am',
booked: false
},
0110: {
time: '11:00am',
booked: false
},
100: {
time: '1:00pm',
booked: false
},
300: {
time: '3:00pm',
booked: false
},
500: {
time: '5:00pm',
booked: false
},
700: {
time: '7:00pm',
booked: false
}
}
},
wednesday: {
name: 'Wednesday',
slots: {
900: {
time: '9:00am',
booked: false
},
0110: {
time: '11:00am',
booked: false
},
100: {
time: '1:00pm',
booked: false
},
300: {
time: '3:00pm',
booked: false
},
500: {
time: '5:00pm',
booked: false
},
700: {
time: '7:00pm',
booked: false
}
}
},
thursday: {
name: 'Thursday',
slots: {
900: {
time: '9:00am',
booked: false
},
0110: {
time: '11:00am',
booked: false
},
100: {
time: '1:00pm',
booked: false
},
300: {
time: '3:00pm',
booked: false
},
500: {
time: '5:00pm',
booked: false
},
700: {
time: '7:00pm',
booked: false
}
}
},
friday: {
name: 'Friday',
slots: {
900: {
time: '9:00am',
booked: false
},
0110: {
time: '11:00am',
booked: false
},
100: {
time: '1:00pm',
booked: false
},
300: {
time: '3:00pm',
booked: false
},
500: {
time: '5:00pm',
booked: false
},
700: {
time: '7:00pm',
booked: false
}
}
},
saturday: {
name: 'Saturday',
slots: {
900: {
time: '9:00am',
booked: false
},
0110: {
time: '11:00am',
booked: false
},
100: {
time: '1:00pm',
booked: false
},
300: {
time: '3:00pm',
booked: false
},
500: {
time: '5:00pm',
booked: false
},
700: {
time: '7:00pm',
booked: false
}
}
}
});
注意顺序。为什么它按字母顺序存储?
当我 return 此数据并在页面上对其进行迭代时,这会成为一个问题,因为日期不是您期望的顺序,而是 return 字母顺序。
有什么办法可以在一定程度上控制它吗?
您需要将函数传递给将执行自定义排序的 orderBy 过滤器。
var myApp = angular.module('myApp',[]);
function MyCtrl($scope) {
$scope.name = 'Superhero';
$scope.days = [
{ name: 'Monday' },
{ name: 'Tuesday' },
{ name: 'Wednesday' },
{ name: 'Thursday' },
{ name: 'Friday' },
{ name: 'Saturday' },
{ name: 'Sunday' }
]
$scope.sortByWeekday = function (day) {
var weekdays = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'];
return weekdays.indexOf(day.name.toLowerCase());
}
}
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
</head>
<body ng-app="myApp">
<div ng-controller="MyCtrl">
<div ng-repeat="day in days | orderBy:sortByWeekday">{{day.name}}</div>
</div>
</body
</html>
我认为您正在寻找 $priority。在 firebase 中排序数据首先由 $priority 完成,其次由 key 完成。 Firebase 中有大量关于 how sorting works 的文档,阅读起来会很好。如果您尝试以预先确定的顺序专门存储数据(并取回数据),我会使用 $priority。
Firebase 数据库存储 JSON 数据。 JSON 对象中的键本质上是无序的。在大多数情况下,Firebase SDK 默认会 return 按字母顺序排列的键。
一般来说,Firebase 建议不要使用数组,但如果这种情况不符合一般建议,您可以这样做:
set({
1: {
name: 'Monday',
slots: {
900: { time: '9:00am', booked: false },
1100: { time: '11:00am', booked: false },
1300: { time: '1:00pm', booked: false },
1500: { time: '3:00pm', booked: false },
1700: { time: '5:00pm', booked: false },
1900: { time: '7:00pm', booked: false }
}
},
2: {
name: 'Tuesday',
slots: {
900: { time: '9:00am', booked: false },
1100: { time: '11:00am', booked: false },
1300: { time: '1:00pm', booked: false },
1500: { time: '3:00pm', booked: false },
1700: { time: '5:00pm', booked: false },
1900: { time: '7:00pm', booked: false }
}
},
3: {
name: 'Wednesday',
slots: {
...
在上面的代码片段中,我还更改了 slots
的键。通过使用 24 小时制时间,它们将按照您希望的方式自动排序。
我在上面发表了评论,在不知道项目范围的情况下很难知道推荐的确切方向。但是,使用日期名称作为键并将时间存储为字符串可能不会长期有效。
简单的答案是将时间slot/event的日期和时间存储为时间戳,格式如YYYYmmddHHMMSS,作为槽的子节点。
例如
training_classes
training_id_1234
timestamp: 20151031130000
trainer: trainer_id1234
client: client_id1234
comment: "Algebra 1"
training_id_3445
timestamp: 20151031150000
trainer: trainer_id1234
client: client_id1234
comment: "Algebra 2"
使用此结构,您可以轻松查询 10 月 31 日星期六的所有 类。在上面的例子中有两个,一个在下午 1 点,一个在下午 3 点。
其他时间没有数据,因此可以在 firebase 中预订(无需存储 booked:false)。
您还可以轻松地对它们进行排序,因为时间戳始终按时间顺序排列 - 它存储在 Firebase 中的顺序无关紧要。
此外,它使更改训练项目变得非常容易。只需更新时间戳和 whammo,它已重新安排。