我有一个包含日期和bin颜色的数组。在同一日期收集了一些垃圾箱,因此我想对这些日期进行分组,然后使用一系列垃圾箱颜色。
我想要实现的数据结构是:
"items": [
"item": {
"date": "2019-10-18T00:00:00.000Z",
"bins": [{
"bin": "Blue"
}, {
"bin": "Grey"
}]
},
...
]
数据数组:
var dateList = [{
"date": "2019-10-18T00:00:00.000Z",
"bin": "Blue"
}, {
"date": "2019-11-08T00:00:00.000Z",
"bin": "Blue"
}, {
"date": "2019-11-01T00:00:00.000Z",
"bin": "Green"
}, {
"date": "2019-11-22T00:00:00.000Z",
"bin": "Green"
}, {
"date": "2019-10-18T00:00:00.000Z",
"bin": "Grey"
}, {
"date": "2019-11-01T00:00:00.000Z",
"bin": "Grey"
}]
这是我到目前为止的代码,它已经存在了,但是没有创建items.item,而是创建了items [date],但是我不知道最后一部分:
var items = {};
for(var i = 0; i < dateList.length; i++) {
if(!items[dateList[i].date]) {
items[dateList[i].date] = {};
items[dateList[i].date].date = dateList[i].date;
items[dateList[i].date].bins = [];
items[dateList[i].date].bins.push( { "bin": dateList[i].bin });
} else {
items[dateList[i].date].bins.push( { "bin": dateList[i].bin });
}
}
这将导致项目[日期]
"items": {
"2019-10-18T00:00:00.000Z": {
"date": "2019-10-18T00:00:00.000Z",
"bins": [{
"bin": "Blue"
}, {
"bin": "Grey"
}]
},
"2019-11-08T00:00:00.000Z": {
"date": "2019-11-08T00:00:00.000Z",
"bins": [{
"bin": "Blue"
}]
},
"2019-11-01T00:00:00.000Z": {
"date": "2019-11-01T00:00:00.000Z",
"bins": [{
"bin": "Green"
}, {
"bin": "Grey"
}]
},
"2019-11-22T00:00:00.000Z": {
"date": "2019-11-22T00:00:00.000Z",
"bins": [{
"bin": "Green"
}]
}
}
如果我能像item.item那样构造它,我会更喜欢
"items": [
"item": {
"date": "2019-10-18T00:00:00.000Z",
"bins": [{
"bin": "Blue"
}, {
"bin": "Grey"
}]
},
"item": {
"date": "2019-11-08T00:00:00.000Z",
"bins": [{
"bin": "Blue"
}]
},
"item": {
"date": "2019-11-01T00:00:00.000Z",
"bins": [{
"bin": "Green"
}, {
"bin": "Grey"
}]
},
"item": {
"date": "2019-11-22T00:00:00.000Z",
"bins": [{
"bin": "Green"
}]
}
]
谢谢
答案 0 :(得分:1)
要获取对象数组,可以将其用作以下代码。请注意,不能保证使用Object.keys()
时的顺序。
我放置了两种方法,一种是简单数组,第二种是使用item
关键字作为数组中每个对象的包装器的数组。
const items = {
"2019-10-18T00:00:00.000Z": {
"date": "2019-10-18T00:00:00.000Z",
"bins": [{
"bin": "Blue"
}, {
"bin": "Grey"
}]
},
"2019-11-08T00:00:00.000Z": {
"date": "2019-11-08T00:00:00.000Z",
"bins": [{
"bin": "Blue"
}]
},
"2019-11-01T00:00:00.000Z": {
"date": "2019-11-01T00:00:00.000Z",
"bins": [{
"bin": "Green"
}, {
"bin": "Grey"
}]
},
"2019-11-22T00:00:00.000Z": {
"date": "2019-11-22T00:00:00.000Z",
"bins": [{
"bin": "Green"
}]
}
}
const array = Object.keys(items).map(key => items[key]);
const arrayWithItems = Object.keys(items).map(key => ({item: items[key]}));
console.log(array);
console.log('!!!! -------- !!!!!');
console.log(arrayWithItems);
答案 1 :(得分:1)
我对此:
var dateList = [{
"date": "2019-10-18T00:00:00.000Z",
"bin": "Blue"
}, {
"date": "2019-11-08T00:00:00.000Z",
"bin": "Blue"
}, {
"date": "2019-11-01T00:00:00.000Z",
"bin": "Green"
}, {
"date": "2019-11-22T00:00:00.000Z",
"bin": "Green"
}, {
"date": "2019-10-18T00:00:00.000Z",
"bin": "Grey"
}, {
"date": "2019-11-01T00:00:00.000Z",
"bin": "Grey"
}]
let dictionary = {};
for(let i = 0; i < dateList.length; i++) {
const item = dateList[i];
if (!dictionary[item.date]) dictionary[item.date] = { date: item.date, bins: [] };
dictionary[item.date].bins.push(item.bin);
}
const result = Object.values(dictionary);
// if you need to have distinct values in bins:
result.forEach(obj => obj.bins = new Array(...new Set(obj.bins)));
console.log(result);
答案 2 :(得分:0)
首先,您期望的结果无效。 javascript数组将不接受键值。数组是项目或对象的列表。以下是您可以获得的输出。
//Output
[
{
"date": "2019-10-18T00:00:00.000Z",
"bins": [
{
"bin": "Blue"
},
{
"bin": "Grey"
}
]
},
{
"date": "2019-11-08T00:00:00.000Z",
"bins": [
{
"bin": "Blue"
}
]
},
{
"date": "2019-11-01T00:00:00.000Z",
"bins": [
{
"bin": "Green"
},
{
"bin": "Grey"
}
]
},
{
"date": "2019-11-22T00:00:00.000Z",
"bins": [
{
"bin": "Green"
}
]
}
]
下面是导出输出的javascript代码。
//Code
var noDuplicates = [];
var lookupObject = {};
for(var i in dateList) {
lookupObject[dateList[i]['date']] = dateList[i];
}
//Create the array with unique dates
for(i in lookupObject) {
noDuplicates.push(lookupObject[i].date);
}
var results=[]
//Iterate and filter the original array with same date value
for(i in noDuplicates) {
var groupedArray = dateList.filter(obj => {
return obj.date === noDuplicates[i]
})
//Form the bins array for the output
var bins = groupedArray.map(obj => {
return {
'bin': obj.bin
}
})
//Construct the output object
results.push({
'date': groupedArray[0].date,
'bins': bins
})
}
是的。这是一种直接解决方案,只需一点点操作即可首先获取唯一值。希望它能解决您的问题。