将对象转换为计数数组
Turning objects into an array of counts
我正试图把注意力集中在一个需要解决的问题上,但似乎没有取得任何进展。我想做的事情很可能更容易举例说明。
我有一个对象数组,看起来像这样:
[
{"city_name": "New York", "visited": "2014-10-20"},
{"city_name": "New York", "visited": "2014-10-20"},
{"city_name": "New York", "visited": "2014-10-20"},
{"city_name": "New York", "visited": "2014-10-21"},
{"city_name": "New York", "visited": "2014-10-21"},
{"city_name": "Stockholm", "visited": "2014-10-20"},
{"city_name": "Stockholm", "visited": "2014-10-20"},
{"city_name": "Stockholm", "visited": "2014-10-21"},
{"city_name": "Stockholm", "visited": "2014-10-21"},
]
现在,我想实现的是将这个阵列变成以下阵列:
[
{
"key": "New York",
"values": [
['2014-10-20', 3], // Because there were 3 visits in New York at this date
['2014-10-21', 2] // Because there were 2 visits in New York at this date
]
},
{
"key": "Stockholm",
"values": [
['2014-10-20', 2],
['2014-10-21', 2]
]
}
]
我尝试使用MapReduce函数(来自Underscore.js)来解决这个问题,但在未能生成我想要的输出后,以及其他几次尝试的相同(失败)结果,我决定在这里提问。也许有人知道该做什么?
而且,对这个可怕的标题感到抱歉。如果你对此有更好的想法,请评论(可能也会帮助其他人解决这个问题)
您可以创建一个中间数据结构来跟踪这两个国家和每个国家的访问情况;然后将该结构映射到最终输出中:
var tmp = {};
visits.forEach(function(item) {
var obj = tmp[item.city_name] || (tmp[item.city_name] = {});
obj[item.visited] = (obj[item.visited] || 0) + 1;
});
var result = Object.keys(tmp).map(function(key) {
return {
key: key,
values: Object.keys(tmp[key]).map(function(date) {
return [date, tmp[key][date]];
})
};
});
如果使用Undercore是一个选项:
var result = _.chain(arr).groupBy('city_name').map(function (el, key) {
return {
key: key,
values: _.chain(el).countBy('visited').pairs().value()
}
}).value();
到此为止:
function make_it_so(src)
{
var usd={}, rsl=[], idx=-1;
src.forEach(function(val,key,arr)
{
var cty = val["city_name"];
if (!usd[cty])
{
idx++;
usd[cty] = {};
rsl[idx] = {"key":cty, "values":[]};
}
if (!usd[cty][val["visited"]])
{
usd[cty][val["visited"]] = val["visited"];
rsl[idx]["values"][rsl[idx]["values"].length] = val["visited"];
}
});
return rsl;
}
var src = [
{"city_name": "New York", "visited": "2014-10-20"},
{"city_name": "New York", "visited": "2014-10-20"},
{"city_name": "New York", "visited": "2014-10-20"},
{"city_name": "New York", "visited": "2014-10-21"},
{"city_name": "New York", "visited": "2014-10-21"},
{"city_name": "Stockholm", "visited": "2014-10-20"},
{"city_name": "Stockholm", "visited": "2014-10-20"},
{"city_name": "Stockholm", "visited": "2014-10-21"},
{"city_name": "Stockholm", "visited": "2014-10-21"}
];
console.log(make_it_so(src));
我的解决方案使用"reduce"answers"map"来计算计数和转换数据:
function countVisitDates(visits) {
// Count the visits per city per date using "reduce".
var counts = visits.reduce(function(memo, visit) {
var cityName=visit.city_name, visitDate=visit.visited;
if (!memo[cityName]) { memo[cityName] = {}; }
memo[cityName][visitDate] |= 0;
memo[cityName][visitDate] += 1;
return memo;
}, {});
// Transform the count structure using "map".
return Object.keys(counts).map(function(cityName) {
return {
key: city_name,
values: Object.keys(counts[cityName]).map(function(date) {
return [date, counts[cityName][date]];
})
};
});
};
countVisitDates(data);
/* =>
[
{
"key": "New York",
"values": [
[ "2014-10-20", 3 ],
[ "2014-10-21", 2 ]
]
},
{
"key": "Stockholm",
"values": [
[ "2014-10-20", 2 ],
[ "2014-10-21", 2 ]
]
}
]
*/
您只需遍历数据:
var data = [
{"city_name": "New York", "visited": "2014-10-20"},
{"city_name": "New York", "visited": "2014-10-20"},
{"city_name": "New York", "visited": "2014-10-20"},
{"city_name": "New York", "visited": "2014-10-21"},
{"city_name": "New York", "visited": "2014-10-21"},
{"city_name": "Stockholm", "visited": "2014-10-20"},
{"city_name": "Stockholm", "visited": "2014-10-20"},
{"city_name": "Stockholm", "visited": "2014-10-21"},
{"city_name": "Stockholm", "visited": "2014-10-21"},
];
var newdata = {};
data.forEach(function(entry) {
var city = entry.city_name;
var time = entry.visited;
if(!newdata[city]) {
newdata[city] = {};
}
if(!newdata[city][time]) {
newdata[city][time]=0;
}
newdata[city][time]++;
});
这给出了一个等价结构,然后可以根据需要使用Object.keys()
:进行转换
{
"New York": {
"2014-10-20": 3,
"2014-10-21": 2
}
,
...
}
相关文章:
- 如何在映射数组中添加换行符
- javascript结合了数组和字典
- 需要帮助设置json数组
- 不能从angular2中的子组件指定父组件中的数组
- 使用JS将数组转换为json对象
- 数组在递归方法中设置为null
- knockoutjs可观察数组
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 将数组从PHP传递到Javascript
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- 在函数中添加数组元素的数值
- 无法通过数组映射绑定
- 将字符串拆分为具有固定字符数的数组
- 使用用户输入的维度,根据每个元素中的字符数筛选数组
- 当月(数)+年(数)
- 数一下数组中的数字,然后把它们写出来
- 循环JSON并在满足条件时停止.然后数一数这些物体
- 查找数百/数千/数十图javascript
- 按可变列数排序数组
- JavaScript:根据相等的值将数组分成组(数组的数组)