【问题标题】:Filtering javascript object structured by date过滤按日期结构化的javascript对象
【发布时间】:2018-06-13 07:04:18
【问题描述】:

我有一个 Firebase 数据库,它存储按日期排序的寄存器。日期的每一部分都是一个键。例如,对于日期 2017-12-01,集合是这样的:

2017 {
    12 {
        01 {
           ...registers
        },
        02 {
           ...registers
        }
    }
}

我认为提出这种结构的人(不是我)试图避免集合占用很大的维度,这很好,但是:

我必须进行查询以过滤日期范围内的所有结果。选择初始化日期和完成日期,您必须将所有寄存器存储到其中。

我是这样写的:

for (let index_year in results) {
            if (parseInt(index_year) >= from_year && parseInt(index_year) <= to_year) {
                for (let index_month in results[index_year]) {
                    if(parseInt(index_month) >= from_month && parseInt(index_month) <= to_month) {
                        for (let index_day in results[index_year][index_month]) {
                            if(parseInt(index_day) >= from_day && parseInt(index_day) <= to_day) {

                                items = results[index_year][index_month][index_day];

                                for (let id in items) {
                                    console.log(items[id])
                                }
                            }
                        }
                    }
                }
            }
        }

当所选日期在同一年内时,这可以正常工作。但是,例如,如果您选择日期范围,例如:2017-12-01 到 2018-01-31,则脚本根本不会返回结果。

你能想出一个更好的脚本来进行这个查询吗?有人做过类似的事情吗?

【问题讨论】:

  • 你能和我们分享一个你的json的真实例子吗?也排序了吗?

标签: javascript firebase object firebase-realtime-database filter


【解决方案1】:

您可以使用适当的访问器将所需范围作为数组并将此数组与数据映射。然后删除结果集的空洞。

在此示例中,范围从 2017-11-292017-12-06,但并非所有日期都在可用对象中。

如果没有可用的内部属性的日期或路径,则返回undefined。这需要在映射后进行过滤。

getData 使用分层结构并检查给定的属性。如果它得到一个falsy 值,它需要一个(几乎)空对象进行访问,这可能会返回undefined、一个对象或一个值。

var data = { 2017: { 11: { 28: { data: '2017-11-28' }, 30: { data: '2017-11-30' } }, 12: { '01': { data: '2017-12-01' }, '03': { data: '2017-12-03' }, '05': { data: '2017-12-01' } } } },
    range = [['2017', '11', '29'], ['2017', '11', '30'], ['2017', '12', '01'], ['2017', '12', '02'], ['2017', '12', '03'], ['2017', '12', '04'], ['2017', '12', '05'], ['2017', '12', '06']],
    getData = (object, path) => path.reduce((o, k) => (o || {})[k], object),
    result = range.map(date => getData(data, date)).filter(Boolean);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 很好@NinaScholz 非常感谢你。现在我只需要考虑如何在两个日期之间生成范围数组生成器。
猜你喜欢
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 2014-07-25
  • 2010-12-30
  • 1970-01-01
相关资源
最近更新 更多