javascript - 在javascript中循环遍历数组中的对象

标签 javascript jquery node.js mongodb d3.js

我对编码相当陌生。我确实搜索了论坛,但找不到我试图解决的问题的答案。我编写了一个基本的 Node 应用程序。它将用于跟踪公立学校系统课后健身计划的效果。每次访问该项目后,学生都会回答一系列问题。教师查看数据来评估该计划。数据存储在 MongoDB 集合中:

 var visitSchema = mongoose.Schema({
    userid: String,
    date: String,
    activitylist: String,
    presession: String,
    health: String,
    bestpart: String,
    worstpart: String,
    postsession: String,
    approved: {
        type: Boolean,
        default: false
    }
 });

我正在使用 d3 尝试显示一些图表,以帮助老师进行分析。这将包括报告与数组中某些项目相关的指标。例如,学生参加了列出的 4 项事件中的一项事件多少次,以查看其中一项事件是否没有被利用。另一个是会前、会后和健康项目,因为这些项目来自 radio 输入,并且是四个选项之一。 我成功地将 mongoDB 数据拉入控制台。

以下是一些访问示例:

    [{"_id":"5a56c70d4035a90aafbe99f2","date":"Wed Jan 10 2018 20:08:13 GMT-0600 (CST)","userid":"5a54270477a5d3ff63803879","activitylist":"swimming","presession":"ok","bestpart":"water","worstpart":"splashing","postsession":"good","__v":0,"approved":true},{"_id":"5a66ab728f12a65cadefb117","date":"Mon Jan 22 2018 21:26:42 GMT-0600 (CST)","userid":"5a54270477a5d3ff63803879","activitylist":"yoga","presession":"good","health":"good","bestpart":"hi","worstpart":"there","postsession":"verygood","__v":0,"approved":true},{"_id":"5a6d0b815e8791217f50948a","date":"Sat Jan 27 2018 17:30:09 GMT-0600 (CST)","userid":"5a67ee7d0f7d0a0b7fb1ae2f","presession":"good","health":"verygood","bestpart":"good","worstpart":"hag","postsession":"good","__v":0,"approved":false},{"_id":"5a6d0b905e8791217f50948b","date":"Sat Jan 27 2018 17:30:24 GMT-0600 (CST)","userid":"5a67ee7d0f7d0a0b7fb1ae2f","presession":"great","health":"good","bestpart":"hi","worstpart":"hello","postsession":"verygood","__v":0,"approved":false},{"_id":"5a6d0d80f6d66c225d103783","date":"Sat Jan 27 2018 17:38:40 GMT-0600 (CST)","userid":"5a67ee980f7d0a0b7fb1ae30","activitylist":"basketball","presession":"great","health":"verygood","bestpart":"hi","worstpart":"hello","postsession":"verygood","__v":0,"approved":false},{"_id":"5a6fe540695e704dd125355a","date":"Mon Jan 29 2018 21:23:44 GMT-0600 (CST)","userid":"5a67ee980f7d0a0b7fb1ae30","activitylist":"basketball","presession":"great","health":"good","bestpart":"bas","worstpart":"nas","postsession":"verygood","__v":0,"approved":false}]

我还成功地将数据呈现在 d3 图表中。这就是我被困住的地方。现在,我正在使用以下代码解析数据并填充图表。下面的示例适用于事件列表项。它会检查数据并计算数据中每个事件的数量:

function constructData(visitData) {
    let data = [{ label: "basketball", value: 0 }, { label: "swimming", value: 0 }, { label: "yoga", value: 0 }]
    visitData.forEach(function(visit) {
        console.log(visit.activitylist)

        for (var i = 0; i < data.length; i++) {
            console.log(data[i])
            //if (visit.activitylist in data[i])
            if (visit.activitylist == data[i].label) { data[i].value++ }
        }



    })

    //change(data);
    console.log(data);
    return data;
}

这适用于解析数据,但我必须对我想要报告的集合中的每个项目执行类似的操作。我一直在寻找一个更全局的函数,我可以将我感兴趣的项目(事件列表、 session 等)传递到其中,或者只是迭代集合中的每个(或选择的)项目。我一直在使用下面的代码,但尚未使其工作。该数组只是一个简单的数组,因此我可以进行测试。

 var data = [{
    'pear': 1,
    'apple': 2
 }, {
    'pear': 5,
    'mango': 10
 }, {
    'pear': 3,
    'apple': 5,
 }]

 let final = []
 data.forEach((visit) => {
    for (var key in visit) {
        if (visit.hasOwnProperty(key)) {
            //console.log(visit[key], key)
            final.forEach((f) => {
                console.log(f)
                if (f[key]) {
                    f[key]++
                        return;
                }

            })
            console.log(key)
            let obj = {}
            obj[key] = 0;
            final.push(obj)
        }

    }

 })
 console.log(final)

因此,任何关于像上面这样的函数的建议都可以循环遍历数据以检查数组中的每个项目或我指定的项目,我们将不胜感激。正如我所说,我对此还很陌生,所以如果我的措辞不完全清楚,我深表歉意。提前致谢。

最佳答案

看起来您对于如何最好地迭代对象属性存在冲突。您有很多选择,如果您想使用循环,您可以执行类似 for-in 的操作:

var visitSchema = {
  userid: 'String1',
  date: 'String2',
  activitylist: 'String3',
  presession: 'String4',
  health: 'String5',
  bestpart: 'String6',
  worstpart: 'String7',
  postsession: 'String8',
  approved: {
      type: true,
      default: false
  }
}

for (var x in visitSchema) {
  console.log(x + ' - ' + visitSchema[x]);
}

虽然使用循环迭代对象和数组肯定没有什么错误,但处理此任务的更现代(更灵活)的方法是将数组方法链接在一起(三大方法是map、filter和reduce)。有一篇很棒的文章就是关于这个的 here .

关于javascript - 在javascript中循环遍历数组中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48533617/

相关文章:

node.js - 如何更新passportjs设置的req.user session 对象?

javascript - 具有一个 ng-click 属性的多个函数调用

java - jsp 中的源 javascript 文件与 spring mvc <3.0.4

javascript - 如何在刷新浏览器时将应用程序重定向到主页?

javascript - 当使用 jquery-week-calendar 在一天内发生多个事件时,事件被向下移动

javascript - 如何根据用户输入在 DOM 中添加 div 的数量

javascript - 为什么 "$(this.target).val()"(引用输入元素)的值是 "undefined"?

javascript - 数据属性事件而不是类名

Node.js 检查选项

javascript - node.js 中的反引号