Javascript对象修改

时间:2016-05-27 07:44:36

标签: javascript arrays javascript-objects

我在结构中有一个javascript对象

var data = {
    "items": [
        {
            "User": {
                "first_name": "Testing",
                "last_name" : "test",
                "age" : 23
                }
            },
            {
            "User": {
                "first_name": "Testing_2",
                "last_name" : "test_tested",
                "age": 24

                }
            },
            {
            "User": {
                "first_name": "Testing_3",
                "last_name" : "test_test",
                "age" : 23
            }
        }
    ]
};

我正在尝试将对象结构修改为, 样本输出:

var data = [
    [
        {
            "User": {
                "first_name": "Testing",
                "last_name" : "test",
                "age" : 23
            }
        },
        {
            "User": {
                "first_name": "Testing_3",
                "last_name" : "test_test",
                "age" : 23
            }
        }
    ],
    [
        {
            "User": {
                "first_name": "Testing_2",
                "last_name" : "test_tested",
                "age": 24
            }
        }                    
    ]
];

逻辑:我正在尝试根据年龄对用户进行分组。但是我的逻辑错误,请告诉我哪里出错或者用任何简单的逻辑来实现所需的解决方案。

items = data.items;
var user = [], out= [];
for (var i = 0; i < items.length; i++) {
    var dt = items[i].User.age,
        index = user.indexOf(dt);
    if (index == -1) {
        user.push(dt);
        out.push(new Array(items[i]));
    } 
    out[index].push(items[i]);  
}
return out;

请帮帮我。

4 个答案:

答案 0 :(得分:3)

将项目插入由age索引的空数组中的存储桶中。过滤掉空桶,你就会得到你想要的东西。

var results = [];
data.items.forEach(function (item) {
  results[item.User.age] = results[item.User.age] || [];
  results[item.User.age].push(item);
});

return results.filter(function (res) { return res; });

答案 1 :(得分:2)

您可以将对象用作对结果数组的引用的哈希表。

此解决方案仅在一个循环中运行。

var data = { "items": [{ "User": { "first_name": "Testing", "last_name": "test", "age": 23 } }, { "User": { "first_name": "Testing_2", "last_name": "test_tested", "age": 24 } }, { "User": { "first_name": "Testing_3", "last_name": "test_test", "age": 23 } }] },
    grouped = [];

data.items.forEach(function (a) {
    if(!this[a.User.age]) {
        this[a.User.age]=[];
        grouped.push(this[a.User.age]);
    }
    this[a.User.age].push(a);
}, Object.create(null));    

console.log(grouped);

答案 2 :(得分:2)

您可以使用age功能

根据.reduce进行分组
var output = data.items.reduce(function(result,obj){
    result[obj.User.age] =  result[obj.User.age] || []
  result[obj.User.age].push(obj);
  return result
},{});

而不是array我们可以使用object,因为它更容易操作。

如果你想要严格的数组,那么我们可以修改如下

Object.keys(output).map(function(x){
  return output[x];
});

答案 3 :(得分:2)

您需要在条件中添加其他

items = data.items;
var user = [], out= [];
for (var i = 0; i < items.length; i++) {
    var dt = items[i].User.age,
        index = user.indexOf(dt);
    if (index == -1) {
        user.push(dt);
        out.push(new Array(items[i]));
    } else {
        out[index].push(items[i]);
    }  
}
return out;

选中此Plunker