在javascript

时间:2018-01-31 02:39:09

标签: javascript jquery node.js mongodb d3.js

我对编码很新。我确实搜索了论坛,但找不到我想解决的问题的答案。我写了一个基本节点应用程序。它将用于跟踪学校健身计划对公立学校系统的效果。每次访问该计划后,学生都会回答一系列问题。教师查看数据以评估该计划。数据存储在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项活动中的一项,看看是否有一次没有被杠杆化。另一个是presession,postsession和health items,因为它们来自无线电输入,是四种选择之一。 我成功地将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图表中渲染数据。这是我被困的地方。现在,我使用以下代码解析数据并填充图表。以下示例适用于activitylist项目。它遍历数据并计算数据中每个活动的数量:

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;
}

因此,它适用于解析数据,但我必须为我想要报告的集合中的每个项目执行类似的操作。我正在寻找一个更全局的功能,我可以通过该功能传递我感兴趣的项目(活动列表,presession等)或只是迭代集合中的每个(或一个选项)项目。我一直在玩这些代码,但还没有使它工作。数组只是一个简单的数组,所以我可以测试。

 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)

因此,对于像上面这样的函数的任何建议都可以在数组中循环检查每个项目或我指定的项目,这将是非常感激的。正如我所说,我对此很新,所以如果我的措辞不完全清楚,我会道歉。提前致谢。

2 个答案:

答案 0 :(得分:0)

看起来您对如何最好地迭代对象属性存在冲突。你有很多选择,如果你想使用循环,你可以做一些像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]);
}

虽然通过迭代对象和带有循环的数组肯定没有错误,但更现代(和光滑)处理此任务的方法是将数组方法链接在一起(三大方法)是地图,过滤和减少)。有一篇关于here的好文章。

答案 1 :(得分:0)

您可以尝试使用这种方法来解析数据,而无需使用太多循环。

const temp = []; 
for (const d in this.data) {
        if (this.data[d]) {
          temp.push({
            name: d,
            value: this.data[d],
          });
        }
}