简体   繁体   中英

Creating an Array of Objects from an Array

I have an array that contains a list of states, for example:

["New York", "Pennsylvania", "New Jersey", "Connecticut", "Maryland", "Delaware", "New York", "Pennsylvania"]

I want to transform that array into an Array of Objects with the count of each element, in the form of:

[{"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}]

Below is my code, and a JSFiddle link to the code. Is there a better/les verbose way of doing this? Thanks!

 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/

I think you meant a less verbose way. You can make it even shorter but it's more readable this way.

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)

here's the jsFiddle : https://jsfiddle.net/Kalkut/47L4y3aq/

You can use a combination of reduce ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce ) and 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 }]);
}, [])

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM