我想按开始日期和结束日期过滤下面的json数据,它应该在开始日期和结束日期之间返回数据,我尝试使用下面的代码实现,但我做错了过滤。我是Javascript和jquery等前端技术的新手,如果有人能够纠正我在这里做错的话,我将不胜感激:
<html>
<head>
<title>Test</title>
</head>
<body>
<script type="text/javascript">
var product_data = [
{
"productId": "12",
"productName": "ProductA",
"productPrice": "1562",
"ProductDateCreated": "2015-07-24T12:58:17.430Z",
"TotalProduct": 294
},
{
"productId": "13",
"productName": "ProductB",
"productPrice": "8545",
"TotalProduct": 294,
"ProductHits": {
"2015-08-01T00:00:00Z"
}
},
{
"productId": "14",
"productName": "ProductC",
"productPrice": "8654",
"TotalProduct": 78,
"ProductHits": {
"2015-08-10T00:00:00Z"
}
},
{
"productId": "15",
"productName": "ProductD",
"productPrice": "87456",
"TotalProduct": 878,
"ProductHits": {
"2015-05-12T00:00:00Z"
}
}
];
var startDate = "2015-08-04";
var endDate = "2015-08-12";
var resultProductData = product_data.filter(
function (a)
{
return (a.ProductHits) > startDate && (a.ProductHits) < endDate;
});
console.log(resultProductData);
</script>
</body>
</html>
答案 0 :(得分:6)
var startDate = new Date("2015-08-04");
var endDate = new Date("2015-08-12");
var resultProductData = product_data.filter(function (a) {
var hitDates = a.ProductHits || {};
// extract all date strings
hitDates = Object.keys(hitDates);
// convert strings to Date objcts
hitDates = hitDates.map(function(date) { return new Date(date); });
// filter this dates by startDate and endDate
var hitDateMatches = hitDates.filter(function(date) { return date >= startDate && date <= endDate });
// if there is more than 0 results keep it. if 0 then filter it away
return hitDateMatches.length>0;
});
console.log(resultProductData);
小提琴:http://jsfiddle.net/4nz1ahuw/
更新,因为Ates Goral在评论中建议使用Array.protype.some优化上述解决方案:
var startDate = new Date("2015-08-04");
var endDate = new Date("2015-08-12");
var resultProductData = product_data.filter(function (a) {
var hitDates = a.ProductHits || {};
// extract all date strings
hitDates = Object.keys(hitDates);
// improvement: use some. this is an improment because .map()
// and .filter() are walking through all elements.
// .some() stops this process if one item is found that returns true in the callback function and returns true for the whole expression
hitDateMatchExists = hitDates.some(function(dateStr) {
var date = new Date(dateStr);
return date >= startDate && date <= endDate
});
return hitDateMatchExists;
});
console.log(resultProductData);
谢谢你的好建议:)
答案 1 :(得分:2)
我无法获得上述解决方案。我发现对批准的答案that worked for me here进行了一些修改。下面的代码段完成了工作。
var startDate = new Date("2015-08-04");
var endDate = new Date("2015-08-12");
var resultProductData = product_data.filter(a => {
var date = new Date(a.ProductHits);
return (date >= startDate && date <= endDate);
});
console.log(resultProductData)
答案 2 :(得分:1)
对于您来说,日期值需要进行封装,例如。新日期(您的日期值)
使用以下示例作为指南给出了另一种方法:
https://jsfiddle.net/ladiv7/tb66ya67/
value = 0
value1 = 0
def stream_handler(message):
global value
value = 0
print(message)
if message['data'] is 1:
value = 1
return value
def stream_handler1(message1):
global value1
value1 = 0
print(message1)
if message1['data'] is 1:
value1 = 1
return value1
if value is 1 & value1 is 1:
response = pn_client.publish(
interests=['hello'],
publish_body={
'apns': {
'aps': {
'alert': 'Hello!',
},
},
'fcm': {
'notification': {
'title': 'Notification',
'body': 'Fall Detected !!',
},
},
},
)
print(response['publishId'])
my_stream = db.child("Fall_Detection_Status").stream(stream_handler)
my_stream1 = db.child("Fall_Detection_Status1").stream(stream_handler1)
&#13;
/*Dummy Data, Courtesy of: https://www.generatedata.com/*/
var dataDates = [{
"date": "Nov 28, 2017",
"name": "Samuel A. Kidd",
"email": "dui.nec@sapienimperdietornare.ca",
"address": "944-343 Nec Avenue"
},
{
"date": "May 20, 2015",
"name": "Jenna R. Alston",
"email": "semper.auctor.Mauris@acrisus.edu",
"address": "5316 Mollis Av."
},
{
"date": "Mar 11, 2018",
"name": "Magee K. Mcfarland",
"email": "Maecenas@egetmollis.co.uk",
"address": "Ap #605-1298 Id Rd."
},
{
"date": "Dec 9, 2016",
"name": "Claudia V. Campbell",
"email": "Donec@semegestas.ca",
"address": "Ap #935-7909 Lectus Rd."
},
{
"date": "Aug 4, 2015",
"name": "Steven V. Reynolds",
"email": "est.ac@ut.net",
"address": "Ap #501-8119 Vel, Rd."
},
{
"date": "Mar 25, 2019",
"name": "Amy O. Bean",
"email": "risus.quis.diam@adipiscingelitEtiam.org",
"address": "1855 Euismod Ave"
},
{
"date": "Jan 12, 2019",
"name": "Quintessa H. Clay",
"email": "arcu.Sed.eu@variusNam.net",
"address": "P.O. Box 127, 812 Lobortis Rd."
},
{
"date": "Feb 7, 2015",
"name": "Marvin P. Golden",
"email": "pellentesque@lobortistellusjusto.org",
"address": "P.O. Box 936, 8921 Augue Av."
},
{
"date": "Aug 4, 2015",
"name": "Shay Z. Clayton",
"email": "sem.egestas@maurisidsapien.org",
"address": "5862 Pede St."
},
{
"date": "Feb 12, 2015",
"name": "Jin G. Jimenez",
"email": "dictum.magna@parturientmontes.org",
"address": "4310 Malesuada Av."
},
{
"date": "Feb 10, 2017",
"name": "Dawn R. Blackwell",
"email": "risus.varius.orci@ipsumdolor.com",
"address": "5585 Metus. St."
},
{
"date": "Apr 28, 2015",
"name": "Audra A. Gates",
"email": "consectetuer.adipiscing@libero.ca",
"address": "448-332 Iaculis Ave"
},
{
"date": "May 6, 2018",
"name": "Gloria K. Dodson",
"email": "mauris.Integer.sem@purusinmolestie.co.uk",
"address": "564-3879 Vel, St."
},
{
"date": "Jan 1, 2015",
"name": "Inga I. Vinson",
"email": "Donec@enimnec.net",
"address": "320-4632 Lacus. Road"
},
{
"date": "Jul 21, 2015",
"name": "Berk M. Owen",
"email": "eros@mi.co.uk",
"address": "727 Bibendum Ave"
},
{
"date": "Feb 27, 2016",
"name": "Jessica C. Thompson",
"email": "Donec@anteNunc.com",
"address": "P.O. Box 903, 2394 A, St."
}
];
$(document).ready(function() {
$('.datepicker').datepicker(); //Activates the datepicker Materialize CSS element
preview_json(dataDates, $("#view_rawData")); //show the original data on the screen
$("#count_RawData").html("(" + dataDates.length + ")");
$("#filter-button").click(function(e) {
console.log("Hello world");
//Gets the form data in a unified manner
var getFormData = {
dates: {
start: $("#date_from").val(),
end: $("#date_to").val()
}
};
//Function to filter the result
var filteredData = dateFilterer(dataDates, getFormData.dates.start, getFormData.dates.end);
preview_json(filteredData.finalValues, $("#view_filteredData")); //show the final result on the screen
$("#count_FilteredData").html("(" + filteredData.finalValues.length + ")");
});
});
//Filter function to ensure that the final result set is within a particular range
function dateFilterer(sourceValues, startDate, endDate) {
/*Curtosy of the tutorial found here: https://www.w3schools.com/jsref/jsref_filter.asp*/
function filterFunction_dates(sourceValue) {
//Aim: To test if the tested date is valid within a particular range
var rangeAcceptance = {
minValid: new Date(sourceValue.date) >= new Date(startDate),
maxValid: new Date(sourceValue.date) <= new Date(endDate)
};
var acceptanceResult; //boolean to determine if the relevant range specified is valid
if (startDate != "" && endDate != "") {
acceptanceResult = (rangeAcceptance.minValid && rangeAcceptance.maxValid);
} else if (startDate != "") {
acceptanceResult = rangeAcceptance.minValid;
} else if (endDate != "") {
acceptanceResult = rangeAcceptance.maxValid;
} else {
acceptanceResult = (1 == 1); //show all results if no specific range has been selected
}
return (acceptanceResult);
}
/*console.log({
originalValues: sourceValues,
finalValues: sourceValues.filter(filterFunction_dates),
"time of filter": new Date()
});*/
//Return the data for display
return ({
originalValues: sourceValues,
finalValues: sourceValues.filter(filterFunction_dates)
});
}
//Aim: To make the dates into something that the Range filter function can work with
function normalize_date(fieldValue) {
var monthPossibilities = {
longStructure: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
shortStructure: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
}; //To store what the month values could possibly be for returning their relevant index number
var datePartitions = fieldValue.split(", ");
var year = datePartitions[1];
var month = datePartitions[0].substring(0, 3); //first three characters of section 1
if (monthPossibilities.longStructure.indexOf(month) > -1) {
month = (monthPossibilities.longStructure.indexOf(month) + 1).toString(); //Increments by one to give the actual month number
} else if (monthPossibilities.shortStructure.indexOf(month) > -1) {
month = (monthPossibilities.shortStructure.indexOf(month) + 1).toString();
} else {
month = "";
}
//Aim: Add that customary zero to prepend the date value
if ((month.length < 2) && (month.length > 0)) {
month = "0" + month;
}
var day = datePartitions[0].slice(-2); //last two characters of section 1
var finalResult = year + "-" + month + "-" + day;
return (finalResult);
}
//Aim: Display json in a nicely formatted way
function preview_json(data, target) {
/*Curtosy of fellow fiddler: http://jsfiddle.net/unLSJ/*/
var library = {};
library.json = {
replacer: function(match, pIndent, pKey, pVal, pEnd) {
var key = '<span class=json-key>';
var val = '<span class=json-value>';
var str = '<span class=json-string>';
var r = pIndent || '';
if (pKey)
r = r + key + pKey.replace(/[": ]/g, '') + '</span>: ';
if (pVal)
r = r + (pVal[0] == '"' ? str : val) + pVal + '</span>';
return r + (pEnd || '');
},
prettyPrint: function(obj) {
var jsonLine = /^( *)("[\w]+": )?("[^"]*"|[\w.+-]*)?([,[{])?$/mg;
return JSON.stringify(obj, null, 3)
.replace(/&/g, '&').replace(/\\"/g, '"')
.replace(/</g, '<').replace(/>/g, '>')
.replace(jsonLine, library.json.replacer);
}
};
//Show json in desired target
target.html(library.json.prettyPrint(data));
}
&#13;
#count_RawData {
color: #89cbfa;
}
#view_rawData,
#view_filteredData {
min-height: 50px;
max-height: 700px;
overflow-y: scroll;
width: 100%;
box-shadow: 0 0 5px #cfcfcf;
border-radius: 5px;
border: none;
}
#count_FilteredData {
color: #498e88;
}
#filter-button {
width: 100%;
}
#filter_section {
width: 100%;
margin-left: auto;
margin-right: auto;
padding: 20px;
/* background-color: #f1f1f1; */
border: 1px solid #cfcfcf;
}
/*Curtosy of the fellow fiddler's code: http://jsfiddle.net/unLSJ/*/
pre {
background-color: ghostwhite;
border: 1px solid silver;
padding: 10px 20px;
margin: 20px;
}
.json-key {
color: brown;
}
.json-value {
color: navy;
}
.json-string {
color: olive;
}
/*Update the scrollbar*/
::-webkit-scrollbar {
width: 7px;
}
::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 10px rgb(255, 255, 255);
border-radius: 10px;
}
::-webkit-scrollbar-thumb {
border-radius: 10px;
-webkit-box-shadow: inset 0 0 6px rgba(132, 144, 154);
}
&#13;
答案 3 :(得分:0)
这是我在two
个日期之间进行过滤的方式。我正在将数据从yesterday
过滤到last7Days
。
public itemFilter()
{
var now = new Date();
let yesterday=new Date(new Date().getTime() - (1 * 24 * 60 * 60 * 1000));
let last7Days=new Date(new Date().getTime() - (7 * 24 * 60 * 60 * 1000));
var data=obj.filter(p => new Date(p.LastSeenDate) <= yesterday && new Date(p.LastSeenDate) >= last3Days);
}
LastSeenDate
是我们产品的日期。
答案 4 :(得分:0)
嗨,你可以使用时刻
moment('2010-10-20').isBetween('2010-10-19', '2010-10-25');