从 json 检索唯一值
retrieve unique values from the json
我知道这应该很容易,但我就是无法让它工作。我有一个具有以下结构的对象:
"name": "Machine 1",
"categories": [
{
"name": "Planned",
"days": [
{
"id": 0,
"date": "2015-09-14T00:00:00",
"time": 768
},
{
"id": 0,
"date": "2015-09-15T00:00:00",
"time": 1100
},
{
"id": 0,
"date": "2015-09-16T00:00:00",
"time": 356
}
]
},
{
"name": "Item 1",
"days": [
{
"id": 0,
"date": "2015-09-14T00:00:00",
"time": 1323
},
{
"id": 0,
"date": "2015-09-15T00:00:00",
"time": 1475
},
{
"id": 0,
"date": "2015-09-16T00:00:00",
"time": 668
}
]
},
因此,如果我想以树状结构显示它,返回的对象将如下所示
- 台机器的数组
- 每台机器都有 类别数组
- 每个类别都有一个天
的列表
我正在尝试做什么而不是我当前的方法(手动迭代)
angular.forEach(machine.categories, function (category, index) {
angular.forEach(category.days, function (day, index) {
newData.labels.push(day.date);
});
});
是使用一个已经存在的库(根据我的研究,underscore.js
应该非常适合这个)并且正确地做它(我正在努力学习,如何使用它)。
所以我想要实现的是获取日期格式的唯一日期列表。所以我得到的对象看起来像这样:
var result = ["2015-09-14", "2015-09-15", "2015-09-16"]
(这个会更好)
有没有办法使用库来完成它(意味着无需手动迭代)?
您可以使用 Set
作为唯一值
var data = { "name": "Machine 1", "categories": [{ "name": "Planned", "days": [{ "id": 0, "date": "2015-09-14T00:00:00", "time": 768 }, { "id": 0, "date": "2015-09-15T00:00:00", "time": 1100 }, { "id": 0, "date": "2015-09-16T00:00:00", "time": 356 }] }, { "name": "Item 1", "days": [{ "id": 0, "date": "2015-09-14T00:00:00", "time": 1323 }, { "id": 0, "date": "2015-09-15T00:00:00", "time": 1475 }, { "id": 0, "date": "2015-09-16T00:00:00", "time": 668 }] }] };
var set = new Set();
data.categories.forEach(e => e.days.forEach(e => set.add(e.date)));
document.write('<pre>' + JSON.stringify(Array.from(set)) + '</pre>');
使用下划线(有点冗长,假设您在名为 data
的变量中解析了 JSON):
var result = _.uniq(
_.flatten(
_.map(data.categories, function(category) {
return _.map(_.pluck(category.days, 'date'), function(date) {
return date.replace(/T\d+:\d+:\d+$/, '');
});
})));
我知道这应该很容易,但我就是无法让它工作。我有一个具有以下结构的对象:
"name": "Machine 1",
"categories": [
{
"name": "Planned",
"days": [
{
"id": 0,
"date": "2015-09-14T00:00:00",
"time": 768
},
{
"id": 0,
"date": "2015-09-15T00:00:00",
"time": 1100
},
{
"id": 0,
"date": "2015-09-16T00:00:00",
"time": 356
}
]
},
{
"name": "Item 1",
"days": [
{
"id": 0,
"date": "2015-09-14T00:00:00",
"time": 1323
},
{
"id": 0,
"date": "2015-09-15T00:00:00",
"time": 1475
},
{
"id": 0,
"date": "2015-09-16T00:00:00",
"time": 668
}
]
},
因此,如果我想以树状结构显示它,返回的对象将如下所示
- 台机器的数组
- 每台机器都有 类别数组
- 每个类别都有一个天 的列表
- 每台机器都有 类别数组
我正在尝试做什么而不是我当前的方法(手动迭代)
angular.forEach(machine.categories, function (category, index) {
angular.forEach(category.days, function (day, index) {
newData.labels.push(day.date);
});
});
是使用一个已经存在的库(根据我的研究,underscore.js
应该非常适合这个)并且正确地做它(我正在努力学习,如何使用它)。
所以我想要实现的是获取日期格式的唯一日期列表。所以我得到的对象看起来像这样:
var result = ["2015-09-14", "2015-09-15", "2015-09-16"]
(这个会更好)
有没有办法使用库来完成它(意味着无需手动迭代)?
您可以使用 Set
作为唯一值
var data = { "name": "Machine 1", "categories": [{ "name": "Planned", "days": [{ "id": 0, "date": "2015-09-14T00:00:00", "time": 768 }, { "id": 0, "date": "2015-09-15T00:00:00", "time": 1100 }, { "id": 0, "date": "2015-09-16T00:00:00", "time": 356 }] }, { "name": "Item 1", "days": [{ "id": 0, "date": "2015-09-14T00:00:00", "time": 1323 }, { "id": 0, "date": "2015-09-15T00:00:00", "time": 1475 }, { "id": 0, "date": "2015-09-16T00:00:00", "time": 668 }] }] };
var set = new Set();
data.categories.forEach(e => e.days.forEach(e => set.add(e.date)));
document.write('<pre>' + JSON.stringify(Array.from(set)) + '</pre>');
使用下划线(有点冗长,假设您在名为 data
的变量中解析了 JSON):
var result = _.uniq(
_.flatten(
_.map(data.categories, function(category) {
return _.map(_.pluck(category.days, 'date'), function(date) {
return date.replace(/T\d+:\d+:\d+$/, '');
});
})));