Firebase新手求助:如何从复杂JS对象中提取日期字段
如何从Firebase的复杂对象数组中提取日期字段?
问题描述
我是Firebase和JavaScript新手,正尝试从复杂对象数组中获取数据,需要提取每条记录中的日期(如'02-01-2018')。目前我已获取到键,但不知道如何访问该日期。以下是我的数据库结构、返回值示例及相关代码:
数据库结构示例
{ "dailyPrices": { "01-50005": { "04-01-2018": { "brands": "", "editorID": "janeef@janeef.com", "name": "dddf", "phone": "", "place": "errr" }, "09-01-2018": { "brandPriceList": [{ "brandName": "DC", "rsp": "400", "stock": "21", "supplierChange": "hhhh", "supplierRegular": "", "wsp": "350" }, { "brandName": "Barti", "rsp": "385", "stock": "54", "supplierChange": "", "supplierRegular": "", "wsp": "d380" } ], "brands": "", "editorID": "janeef@janeef.com", "name": "dddf", "orderRequirement": { "casualRequirements": "", "followUpDate": "", "followUpRemarks": "", "noOfBags": "", "prospectiveness": "", "scheduledOrderDate": "", "scheduledOrderRemarks": "", "urgentRequirementRemarks": "", "urgentRequirements": "" }, "phone": "", "place": "errr" } } } }
HTML代码
<input type="text" name="ordDetailTXT" id="ordDetailTXT" value="dailyPrice">
JavaScript代码
function findOrderDetails(parentKey) { var returnArr = []; var fetchRecord = database.ref(parentKey); fetchRecord.on('value', function(snapshot) { var item = snapshot.val(); item.key = snapshot.key; returnArr.push(item); }); } function btnClickedOrdDetails(){ var parentkey = ("#ordDetailTXT").val(); findOrderDetails(parentKey); }
请求帮助实现提取日期字段的功能。
解决方案
别担心,我来一步步帮你搞定这个问题!首先要明确:你的数据里,日期其实是子节点的键(比如"04-01-2018"),不是某个字段的值,所以我们需要遍历这些子节点来拿到日期。先帮你修正现有代码的小问题,再实现核心功能:
1. 先修正基础代码的小错误
你的btnClickedOrdDetails函数里有两个小问题,会导致代码跑不起来:
- jQuery选择器少了
$符号,应该是$("#ordDetailTXT").val() - 变量名
parentkey和函数参数的parentKey大小写不一致,会导致传参失败
修正后的函数:
function btnClickedOrdDetails(){ var parentKey = $("#ordDetailTXT").val(); // 修正选择器和变量名 findOrderDetails(parentKey); }
另外注意:你的输入框value是dailyPrice,但数据库里的节点是dailyPrices(多了个s),建议把输入框的value改成dailyPrices,不然会找不到数据哦!
2. 提取日期键的核心逻辑
用Firebase快照的forEach方法遍历子节点,就能直接拿到每个日期的键。我帮你重写了findOrderDetails函数,不仅能提取日期,还能同时获取日期对应的详细数据:
function findOrderDetails(parentKey) { var dateList = []; // 用来存储所有提取到的日期 var fetchRecord = database.ref(parentKey); fetchRecord.on('value', function(snapshot) { // 遍历dailyPrices下的每个商品节点(比如"01-50005") snapshot.forEach(function(productSnapshot) { // 遍历当前商品下的所有日期节点 productSnapshot.forEach(function(dateSnapshot) { var dateKey = dateSnapshot.key; // 这里就是你要的日期,比如"04-01-2018" dateList.push(dateKey); // 如果需要同时获取日期对应的详细数据,就用下面这行 var dateData = dateSnapshot.val(); console.log(`日期:${dateKey} 对应的详细数据:`, dateData); }); }); // 提取完成后,你可以用dateList做后续操作,比如渲染到页面 console.log("所有提取到的日期:", dateList); }); }
3. 额外优化:获取去重的日期列表
如果同一个日期出现多次,想要去重的话,可以用Set来处理:
var uniqueDates = [...new Set(dateList)]; console.log("去重后的日期列表:", uniqueDates);
这样就能轻松拿到所有日期啦!
内容的提问来源于stack exchange,提问作者Ishtiaq Ahmed
相关产品推荐
相关产品推荐

