根据年龄值将对象数组拆分为新的对象数组

3

在Javascript中,根据年龄值将对象数组拆分为新的对象数组

var items = [
    {name:"Foo", age:16, color:"w"},
    {name:"Bar", age:18, color:"b"},
    {name:"foo", age:16, color:"w"},
    {name:"bar", age:18, color:"w"},
    {name:"foobar", age:18, color:"b"},
    {name:"barfoo", age:20, color:"w"}
];

如何返回一个类似这样的列表:
var items = [
    {age:16,name:"Foo"|"foo",gender:"w"|"w"},
    {age:18,name:"Bar"|"bar"|"foobar",gender:"b"|"w"|"b"},
    {age:20,name:"barfoo",gender:"w"}
];

我已经工作了,但是我的输出中有一个名称为“undefined”。以下是我的代码。

var data = [{age: 21,name: "Walter",color: "black"},{age: 25,name: "sentinel",color: "black"
},{age: 21,name: "Micah",color: "purple"},{age: 25,name: "mike",color: "black"},{age: 21,name: "Danny",color: "white"},{age: 25,name: "mike",color: "black"}];
var obj=data;
var arrayobj = obj.length;
var i, row, arr = obj, ss = {};
for (i = 0; i < arr.length; i++) {
    row = arr[i];   
    ss[row.age] = ss[row.age] || {count: 0};
    if (ss[row.age][row.age] === undefined) {                          
        ss[row.age][row.name] = row.name;
        ss[row.age]['name']+=row.name+'|';
        ss[row.age]['color']+=row.color+'|';
        ss[row.age]['count'] += 1;
    }
}
console.table(ss);

这些 | 有什么原因吗?你是不是想嵌套数组?最终结果是无效的语法。 - Benjamin Gruenbaum
像大多数编程问题一样,您需要思考问题,想出一个合适的算法并实现它。 - Blue Skies
@BenjaminGruenbaum:虽然从技术上讲,这不是无效的语法,但它绝对不是提问者想要做的。 - Qantas 94 Heavy
1
@Qantas94Heavy 你说得对,这不是无效的语法 - 只是有趣的语法,有那么多的按位或 :) - Benjamin Gruenbaum
1
这个问题不适合讨论,因为“要求提供代码的问题必须展示对问题的基本理解。包括尝试过的解决方案、为什么它们不起作用以及期望的结果”。 - Blue Skies
3个回答

10

我假设您想按年龄对项目进行分组。这是一种方法:

(fiddle)

items.reduce(function(buckets,item){
    if(!buckets[item.age]) buckets[item.age] = [];
    buckets[item.age].push(item);
    return buckets;
},{});

让我们解释一下:

  • 对于每个项目,如果我们还没有为它创建“桶”,则创建一个新的空桶
  • 将其添加到桶中
  • 返回新更新的桶列表。

该方法返回一个具有3个属性的对象:16、18和20,每个属性包含相应年龄的对象。


我打赌OP的意思是|在字符串中作为分隔符。我也打赌只要OP付出一点努力就能想出如何做到这一点。 - Blue Skies
1
简洁明了。留给 OP 迭代桶,针对每个元素的名称和颜色属性调用 join('|') 函数。 - ffflabs
@BlueSkies 很抱歉,但我忍不住要利用这个机会进行代码的 简化 :) 由于这实际上是一个简单的一步问题 - 我不确定“OP尝试了什么”在这里是否相关,但我完全理解这种批评。 - Benjamin Gruenbaum
谢谢。我想要一个新的对象数组。你能帮我吗? - user3026304
@user3026304:你卡在哪里了?你不知道该怎么做吗? - Blue Skies
@user3026304 我可以帮助你,但我不是很清楚你需要什么。你可能需要先了解JavaScript中数组和对象的语法以及如何与它们交互,因为你问题中的语法可能不是你想要的 - http://eloquentjavascript.net/chapter4.html - Benjamin Gruenbaum

1
这将起作用。输出格式与exebook提供的格式不同。
请检查并确认。这里有一个示例... **UX经理
var buckets = [];

for (var item in items) {
    var currentAge = items[item].age;

    if(!buckets[currentAge]) {
        buckets[currentAge] = [];
        for (var i in items) {      
            if (currentAge === items[i].age) {
                buckets[currentAge].push(items[i]);
            }
        }
    }

}

0
var items = [
     {name:"Foo", age:16, color:"w"},
     {name:"Bar", age:18, color:"b"},
     {name:"foo", age:16, color:"w"},
     {name:"bar", age:18, color:"w"},
     {name:"foobar", age:18, color:"b"},
     {name:"barfoo", age:20, color:"w"}
];

var result = [] // THIS IS THE RESULTING ARRAY THAT YOU WANT

function find(age) {
    for (var i = 0; i < result.length; i++)
        if (result[i].age == age) return i
    return -1
}

function append(i, obj) {
    result[i].name.push(obj.name)
    result[i].color.push(obj.color)
}

for (var i = 0; i < items.length; i++) {
    var x = find(items[i].age)
    if (x < 0) result.push({ age: items[i].age, name: [items[i].name], color : [items[i].color]})
    else append(x, items[i])
}

console.log(result) // PRINT THE RESULT, alternatively you can use alert(result)

输出

[ { age: 16, name: [ 'Foo', 'foo' ], color: [ 'w', 'w' ] },
  { age: 18, name: [ 'Bar', 'bar', 'foobar' ], color: [ 'b', 'w', 'b' ] },
  { age: 20, name: [ 'barfoo' ], color: [ 'w' ] } ]

谢谢,我喜欢这个!这个答案真的很符合我的期望。 - user3026304

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接