【发布时间】:2020-05-01 02:16:03
【问题描述】:
我在使用 nodejs 中的 javascript 循环遍历 json-Array 时遇到问题。 我的名为birthdaysArray 的数组看起来像:
[{"birth":"23.04.1988","name":"Tom Smith"},{"birth":"15.04.2010","name":"Mini Jall"},...,{"birth":"23.04.2001","name":"Michael Bird"},{"birth":"15.11.1999","name":"Frank Middleton"}]
现在我想要一个列出当前月份的生日(按出生日期排序)的数组。具有相同日期和月份(例如 23.04)的条目应列在同一日期。它应该看起来像,如果 4 月是当前 月(列表有超过 100 个条目。):
[{"day":"15","name":["Mini Jall"]},{"day":"23", "name": ["Tom Smith","Michael Bird"]}]
我环顾四周,但没有找到解决方案。 我检查了这个:
for(var i = 0; i < json.length; i++) {
var obj = json[i];
console.log(obj.id);
}
但不匹配。谁能帮忙?
附件 1: 我在 node_helper.js 中的代码:
start() {
console.log("Starting module helper: " + this.name);
// console.log("Pfad zur csv-Datei: " + this.path + "/data/birthdays.csv");
const csvFilePath = this.path + '/data/birthdays.csv';
csv()
.fromFile(csvFilePath)
.then((jsonObj)=>{
birthdaysArray = JSON.stringify(jsonObj);
console.log("birthdaysArray: " + birthdaysArray);
var result = Object.entries(birthdaysArray.reduce((a, {birth, name}) => {
const day = +birth.split('.')[0];
a[day] = [...(a[day] || []), name];
return a
}, {})).map(([day, name]) => ({day, name})).sort((a, b) => +a.day - b.day)
console.log("sorted birthdays : " + result);
})
}
=> 输出 console.log :
Unhandled rejection TypeError: birthdaysArray.reduce is not a function
at /home/dirk/MagicMirror/modules/perlchamp/node_helper.js:27:47
at Object.onfulfilled (/home/dirk/MagicMirror/node_modules/csvtojson/v2/Converter.js:112:33)
at Result.endProcess (/home/dirk/MagicMirror/node_modules/csvtojson/v2/Result.js:83:50)
at Converter.processEnd (/home/dirk/MagicMirror/node_modules/csvtojson/v2/Converter.js:179:21)
at /home/dirk/MagicMirror/node_modules/csvtojson/v2/Converter.js:172:19
at tryCatcher (/home/dirk/MagicMirror/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/home/dirk/MagicMirror/node_modules/bluebird/js/release/promise.js:547:31)
at Promise._settlePromise (/home/dirk/MagicMirror/node_modules/bluebird/js/release/promise.js:604:18)
at Promise._settlePromise0 (/home/dirk/MagicMirror/node_modules/bluebird/js/release/promise.js:649:10)
at Promise._settlePromises (/home/dirk/MagicMirror/node_modules/bluebird/js/release/promise.js:729:18)
at _drainQueueStep (/home/dirk/MagicMirror/node_modules/bluebird/js/release/async.js:93:12)
at _drainQueue (/home/dirk/MagicMirror/node_modules/bluebird/js/release/async.js:86:9)
at Async._drainQueues (/home/dirk/MagicMirror/node_modules/bluebird/js/release/async.js:102:5)
at Immediate.Async.drainQueues [as _onImmediate] (/home/dirk/MagicMirror/node_modules/bluebird/js/release/async.js:15:14)
at processImmediate (internal/timers.js:439:21)
那么,我该怎么办?
附件2: 首先我想按月份过滤字符串:
var today_month = moment().format("MM")
var monthList = [];
for(let prop in jsonObj) {
if (jsonObj[prop]["birth"].split(".")[1] == today_month) {
//console.log("fifth: ", jsonObj[prop]);
monthList += jsonObj[prop];
}
}
console.log("monthList: ", monthList);
...然后将代码(绿色钩子,第二个)应用到它。不幸的是,它不像我想象的那样工作,你现在可以一次性完成吗?因此,从当月的年度生日列表中过滤,然后按照我上面提到的那样显示这些条目。
【问题讨论】:
-
您的
json元素没有id,为什么您认为记录它会起作用? -
准确地说,这是一个对象数组——这里没有 JSON
-
所以,您需要过滤数组中
birth属性在当前月份的对象,然后将该数组缩减为按出生日期对人进行分组,然后对结果进行排序数组以使其按顺序排列 -
为什么(结果)
"name": "Mini Jall"而不是"name": ["Mini Jall"]? -
你是对的,对不起。我会编辑它
标签: javascript arrays json loops sorting