使用Underscore JS对JSON数组进行分组

4

我有一个如下的JSON数组对象:

var orders = [{
    orderId: 1,
    firstName: 'John',
    lastName: 'Smith',
    address: {
        street: '123 Main Street',
        city: 'New York',
        zip: 10001
    }
}, {
    orderId: 2,
    firstName: 'John',
    lastName: 'Smith',
    address: {
        street: '456 Main Street',
        city: 'New York',
        zip: 10001
    }
}, {
    orderId: 3,
    firstName: 'John',
    lastName: 'Smith',
    address: {
        street: '123 Main Street',
        city: 'New York',
        zip: 10001
    }
}, {
    orderId: 4,
    firstName: 'John',
    lastName: 'Smith',
    address: {
        street: '123 Main Street',
        city: 'New York',
        zip: 10002
    }
}];

我正在尝试使用underscore.js创建一个新的数组对象,按地址分组以满足显示所有已发货订单的使用情况,地址为123 Main Street, New York, 1001

如果您觉得underscore.js是正确的方法,那么应该怎么做呢?任何提示都会很有帮助。


这会输出什么?对象指向数组?你会用什么作为对象的键?数组中还有数组吗? - Ruan Mendes
@JuanMendes - 输出将是一个数组的数组。我现在正在尝试您关于_.groupBy的建议。 - orchard
2个回答

3

See _.groupBy

console.log(_.groupBy(orders, function(obj){
    return obj.address.street + '|' + obj.address.city + '|' + obj.address.zip;
}));

请查看http://jsfiddle.net/mendesjuan/gc47ruyL/1/
这个例子假设您的地址中不能有一个|,您可能需要一个更好的分隔符或使用JSON.stringify
console.log(_.groupBy(orders, function(obj){
    return JSON.stringify([obj.address.street, obj.address.city, obj.address.zip]);
}));

1
如果您不想选择特定的分隔符,return JSON.stringify(…) 始终可用于转义。 - Bergi
1
@JuanMendes:实际上我是想把每个字符串单独转换为字符串,或者可能是它们的数组,以获得像你答案中那样的连接。我甚至没有考虑过JSON.stringify(obj.address)的可能性,这确实会遇到上述问题。 - Bergi
@Bergi,我仍然不明白您使用JSON.stringify获取组键的意思。 您介意编辑答案并添加您的替代方案吗? 我最关心的是当您有两个对象{a:“aa”,b:“aa”}{a:“a”,b:“aaa”}{a:“a |”,b:“b”}{a:“a”,b:“| b”}的情况。 - Ruan Mendes
1
@JuanMendes - 感谢您建议使用 _.groupBy - 这正是我所需要的。我是一个新用户,在这里得到了惊人的帮助。我将尽一切努力回馈社区。 - orchard
1
@orchard 我也遇到了同样的问题,5年前我就上瘾了。https://dev59.com/CHI-5IYBdhLWcg3wZ3nC - Ruan Mendes
显示剩余3条评论

2
如果您的页面已经加载了下划线库 underscore,您可以使用以下代码:
var filteredOrders = _.filter(orders, function(order){
  return (order.address.street === '123 Main Street') &&
          (order.address.city === 'New York') &&
          (order.address.zip === 10001);
});

Fiddle


1
@orchard,请更新问题并提供一个示例以展示此要求。 - amit_g
@JordanGray 其实它不能很容易地扩展,如果你知道你要查找的内容,那么它就很简单,否则,需要一些繁重的工作来找到重复项。 - Ruan Mendes
@JuanMendes 好观点;我忽略了排除重复项的考虑。不过,我认为阿米特应该得到一些赞扬,因为他回答了问题。 :) - Jordan Gray
@JordanGray - 我尝试的第一件事是将答案标记为有帮助 :) 但我是一个新用户,发现我没有所需的声望(15分)来这样做...我完全同意Amit的回答确实非常有帮助。 - orchard
@orchard 你们两个都误解了我的意思,我的观点是你必须扫描一次数组,然后找到所有具有相同地址的对象,重复不是最好的词。 - Ruan Mendes
显示剩余4条评论

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