从数组创建对象数组

时间:2015-08-18 16:27:38

标签: javascript arrays object highcharts

我有一个包含状态列表的数组,例如:

["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);

https://jsfiddle.net/ljd144/ok7x8Lny/

2 个答案:

答案 0 :(得分:2)

我认为你的意思不那么冗长。你可以缩短它,但这种方式更具可读性。

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/

答案 1 :(得分:0)

您可以结合使用reduce(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)和filter(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_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 }]);
}, [])