我有一个数组,它包含一个状态列表,例如:
["New York", "Pennsylvania", "New Jersey", "Connecticut", "Maryland", "Delaware", "New York", "Pennsylvania"]我希望将该数组转换为具有每个元素计数的对象数组,其形式为:
[{"name":"New York","y":2},{"name":"Pennsylvania","y":2},{"name":"New Jersey","y":1},{"name":"Connecticut","y":1},{"name":"Maryland,"y":1}, {"name":"Delaware","y":1}]下面是我的代码,以及到代码的JSFiddle链接。有没有更好/更详细的方法来做到这一点?谢谢!
var stateArr = ["New York", "Pennsylvania", "New Jersey", "Connecticut", "Maryland", "Delaware", "New York", "Pennsylvania", "New Jersey", "Connecticut", "Maryland", "Delaware", "New York", "Pennsylvania", "New Jersey", "New York", "Pennsylvania", "New Jersey", "New York", "Pennsylvania", "New Jersey", "Maryland", "Maryland", "Connecticut", "Delaware", "New Jersey", "New Jersey", "New York", "Pennsylvania", "Maryland", "Pennsylvania", "New Jersey", "Connecticut", "Maryland", "New York", "Pennsylvania"];
console.log(stateArr);
var stateCounts = {};
for (i = 0; i < stateArr.length; i++) {
if (!stateCounts[stateArr[i]]) {
stateCounts[stateArr[i]] = 0;
}
stateCounts[stateArr[i]]++;
}
console.log(stateCounts);
var stateNames = Object.keys(stateCounts);
var stateNamecounter = 0;
var stateSeries = [];
for (i = 0; i < Object.keys(stateCounts).length; ++i) {
var obj = {
name: stateNames[i],
y: stateCounts[stateNames[i]]
};
stateSeries.push(obj);
}
console.log(stateSeries);
发布于 2015-08-18 16:58:56
我想你是说一种不那么冗长的方式。您可以使它更短,但它是更易读的方式。
var sortedStateArr = stateArr.sort()
var comparisonElement = sortedStateArr[0]
var result = [{ name : comparisonElement, y : 1 }]
for( var i = 1, n = sortedStateArr.length; i < n; i++) {
if(comparisonElement != sortedStateArr[i] ) result.push({ name : sortedStateArr[i], y : 1 })
else
result[result.length - 1].y++
comparisonElement = sortedStateArr[i]
}
console.log(result)这是jsFiddle:https://jsfiddle.net/Kalkut/47L4y3aq/
发布于 2015-08-18 16:38:37
您可以使用精简(Objects/Array/Reduce)和过滤器(Objects/Array/filter)的组合。
var result = ["New York", "Pennsylvania", "New Jersey", "Connecticut", "Maryland", "Delaware", "New York", "Pennsylvania"].reduce(function(a, b){
// find the element in the result if it already exists
var state = a.filter(function(e) { return e.name === b; })[0]
if (state !== undefined) {
state.y++
return a;
}
else
// otherwise append it to the ongoing result array
return a.concat([{ name: b, y: 1 }]);
}, [])https://stackoverflow.com/questions/32077807
复制相似问题