【问题标题】:Group by on JSON array using Underscore JS使用 Underscore JS 对 JSON 数组进行分组
【发布时间】:2014-12-01 22:39:26
【问题描述】:

我有一个 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 是正确的做法吗?如果是这样,我应该怎么做?任何提示都会有所帮助。

【问题讨论】:

  • 这个输出会是什么?指向数组的对象?你会用什么键控对象?数组数组?
  • @JuanMendes - 输出将是一个数组数组。我正在尝试你提出的关于 _.groupBy 的建议。

标签: javascript underscore.js


【解决方案1】:

_.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]);
}));

【讨论】:

  • 感谢@JuanMendes - 我认为 groupBy 会解决我的问题。我在上面发布的 JSON 是我所拥有的过于简化的版本,所以我试图将这些部分组合在一起。我会在这里更新以告知它是否有效。再次感谢 - 大家 - 的帮助。
  • 如果您不想选择特定的分隔符,return JSON.stringify(…) 始终适用于转义。
  • @JuanMendes:实际上我的意思是 stringify 每个字符串都可以单独使用,或者可能是它们的数组,以获得像你的答案一样的连接。我什至没有想到JSON.stringify(obj.address) 的可能性,它确实会遇到上述问题。
  • @JuanMendes - 感谢您建议使用 _.groupBy - 这正是我所需要的。我是这里的新用户,对我提供的帮助感到惊讶。我会尽一切努力回馈。
  • @orchard 五年前我也遇到过同样的事情,自从stackoverflow.com/questions/1868333/…@orchard 就上瘾了
【解决方案2】:

如果你的页面中已经有下划线,你可以使用

var filteredOrders = _.filter(orders, function(order){
  return (order.address.street === '123 Main Street') &&
          (order.address.city === 'New York') &&
          (order.address.zip === 10001);
});

Fiddle

【讨论】:

  • 感谢@amit_g - 这很有帮助,但这适用于只有 1 个地址的特定示例。我发布的 JSON 示例代表了一个数组,该数组可以包含具有不同地址的多个用户。我需要能够比较所有用户的地址对象,以便找到共享相同地址的所有用户。
  • @orchard,请用示例更新问题以证明此要求。
  • @JordanGray 其实它不是很容易扩展,如果你知道你在搜索什么就很容易,否则,需要一些繁重的工作才能找到重复
  • @JuanMendes 好点;我忽略了排除重复项。尽管如此,我觉得阿米特回答了所提出的问题,值得称赞。 :)
  • @JordanGray - 我尝试的第一件事是将答案标记为有用 :) 但我是新用户,发现我没有这样做所需的声誉(15 分)。 .. 我完全同意 Amit 的回答确实很有帮助。
猜你喜欢
  • 2014-05-22
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多