首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数组创建对象数组

从数组创建对象数组
EN

Stack Overflow用户
提问于 2015-08-18 16:27:38
回答 2查看 61关注 0票数 0

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

代码语言:javascript
复制
["New York", "Pennsylvania", "New Jersey", "Connecticut", "Maryland", "Delaware", "New York", "Pennsylvania"]

我希望将该数组转换为具有每个元素计数的对象数组,其形式为:

代码语言:javascript
复制
[{"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链接。有没有更好/更详细的方法来做到这一点?谢谢!

代码语言:javascript
复制
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/

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-18 16:58:56

我想你是说一种不那么冗长的方式。您可以使它更短,但它是更易读的方式。

代码语言:javascript
复制
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/

票数 2
EN

Stack Overflow用户

发布于 2015-08-18 16:38:37

您可以使用精简(Objects/Array/Reduce)和过滤器(Objects/Array/filter)的组合。

代码语言:javascript
复制
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 }]);
}, [])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32077807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档