【问题标题】:NodeJS Json sort by child arrayNodeJS Json按子数组排序
【发布时间】:2021-03-10 07:32:44
【问题描述】:

我想通过它的子数组对我的对象进行排序。

let partners = [
  {
    Name: "A",
    Sectors: [
      { Code: "AA1", Total: 10 },
      { Code: "AA2", Total: 70 }
    ]
  },
  {
    Name: "B",
    Sectors: [
      { Code: "AA1", Total: 20 },
      { Code: "AA2", Total: 60 }
    ]
  },
  {
    Name: "C",
    Sectors: [
      { Code: "AA1", Total: 40 },
      { Code: "AA2", Total: 50 }
    ]
  }
];

假设我想按Code = AA1 DESC 所在的支柱部门进行排序。结果(道具名称)将是:

C、B、A

或者如果我需要Code = AA2 DESC,将是 A、B、C

我遇到了一些像这样的简单排序的困难:

let sorted = partners.sort((a, b) => a.Sectors.Total - b.Sectors.Total);

sorted.forEach((sortedData) => console.log(sortedData));

Here is a SandBox

这里是正确的答案,将 acept empty 改为 acept empty。

let partners = [
{"Name":"E","Sectors": null}, 
{"Name":"A","Sectors":[{"Code":"AA1","Total":10},{"Code":"AA2","Total":70}]},
{"Name":"B","Sectors":[{"Code":"AA1","Total":20},{"Code":"AA2","Total":60}]},
{"Name":"C","Sectors":[{"Code":"AA1","Total":40},{"Code":"AA2","Total":50}]}, 
{"Name":"D","Sectors": null},
{"Name":"P","Sectors": []}
]

partners.sort((a, b) => {
    const get = (arr, key, val) => {
    return arr.find(o => o[key] === val) || {};
  }
  
  let sA = {}, sB = {}
  
  try {
    sA = get(a.Sectors, 'Code', 'AA1')
    sB = get(b.Sectors, 'Code', 'AA1')
  } catch (e) {}
  
  
  return !!sB.Total - !!sA.Total || sB.Total - sA.Total 
})

console.log(partners)

【问题讨论】:

    标签: javascript node.js arrays json sorting


    【解决方案1】:

    您可以使用 sortfind 方法来做到这一点。在排序中,您需要从 Sectors 数组中找到具有特定 Code 的元素,然后比较 Total 的值。

    let partners = [{"Name":"A","Sectors":[{"Code":"AA1","Total":10},{"Code":"AA2","Total":70}]},{"Name":"B","Sectors":[{"Code":"AA1","Total":20},{"Code":"AA2","Total":60}]},{"Name":"C","Sectors":[{"Code":"AA1","Total":40},{"Code":"AA2","Total":50}]}]
    
    partners.sort((a, b) => {
      const sA = a.Sectors.find(({ Code }) => Code === 'AA1');
      const sB = b.Sectors.find(({ Code }) => Code === 'AA1');
      return sB.Total - sA.Total
    })
    
    console.log(partners)

    【讨论】:

    • 有时 a.Sectors 或 b.Sector 将为空或为空...空不是问题,我怎样才能做某种空值以使这种排序不会中断?
    • 我在 NodeJS 12 上运行它,所以我没有问号 (?) 像 const sA = a?.Sectors?.find(({ Code }) => Code == = 'AA1');
    • 你可以这样做jsfiddle.net/5bjuoLem!!sB.Total - !!sA.Total 这会将空值放在最后,sB.Total - sA.Total 在这里您可以修改 sB 和 sA 的顺序以获得 asc 或 desc 顺序。
    • 不适用于empty´s...列表中有Sectors null 或Empty...
    • 只是更改为返回 arr.find(o => o[key] === val) || {};并且工作得很好...但是 null 出现在 empty 前面...那条线...谢谢!
    【解决方案2】:

    您可以采用动态方法并找到所需的排序值。

    const
        sortBy = (fn, order) => (a, b) => (order === 'ASC' || -1) * (fn(a) - fn(b)),
        getValue = code => o => o.Sectors.find(({ Code }) => Code === code)?.Total || 0,
        partners = [{ Name: "A", Sectors: [{ Code: "AA1", Total: 10 }, { Code: "AA2", Total: 70 }] }, { Name: "B", Sectors: [{ Code: "AA1", Total: 20 }, { Code: "AA2", Total: 60 }] }, { Name: "C", Sectors: [{ Code: "AA1", Total: 40 }, { Code: "AA2", Total: 50 }] }];
    
    console.log(partners.sort(sortBy(getValue('AA1'), 'DESC')));
    console.log(partners.sort(sortBy(getValue('AA2'), 'DESC')));
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      猜你喜欢
      • 2015-04-22
      • 2014-06-10
      • 1970-01-01
      • 2017-10-15
      • 2012-08-16
      • 2011-01-29
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多