【问题标题】:Group or summarize Javascript array分组或汇总 Javascript 数组
【发布时间】:2018-05-04 05:07:01
【问题描述】:
var json =
[
   {
      id: 11,
      name:"app1",
      family:"apps",
      caseID: 123,
      order:1
   },
   {
      id: 12,
      name:"app1",
      family:"apps",
      caseID: 123,
      order:2
   },
   {
      id: 13,
      name:"app1",
      family:"apps",
      caseID: 123,
      order:3
   },
   {
      id: 14,
      name:"app2",
      family:"tools",
      caseID: 129,
      order:1
   },
   {
      id: 15,
      name:"app2",
      family:"tools",
      caseID: 129,
      order:2
   },
   {
      id: 16,
      name:"app3",
      family:"utils",
      caseID: 120,
      order:1
   },
   {
      id: 17,
      name:"app3",
      family:"utils",
      caseID: 120,
      order:2
   },
      id: 18,
      name:"app3",
      family:"utils",
      caseID: 150,
      order:null
   }
  ] 

您好,我想按最高的“order”键对上面的数组进行排序,然后返回下面的过滤数组。公共密钥是 caseID。此外,如果订单键为空,则返回它。 我已经搜索并测试了一些函数和循环,但似乎无法做到。任何帮助都感激不尽。如果可能的话,我更喜欢 es2015。 谢谢!

filtered = 
 [

  {
      id: 13,
      name:"app1",
      family:"apps",
      caseID: 123,
      order:3  
   },
   {
      id: 15,
      name:"app2",
      family:"tools",
      caseID: 129,
      order:2
   },
   {
      id: 17,
      name:"app3",
      family:"utils",
      caseID: 120,
      order:2
   },
   {
      id: 18,
      name:"app3",
      family:"utils",
      caseID: 150,
      order:null
   }
  ]

【问题讨论】:

  • 我认为没有任何努力。
  • 另外,问题没有解释从输入确定输出的逻辑。输出缺少输入中的许多元素。
  • 谢谢大家的回复。我将通过所有的答案来学习一两件事。

标签: javascript arrays json ecmascript-6


【解决方案1】:

我会从摆脱受骗开始。您可以使用reduce() 执行此操作,并将其分配给以caseID 为键的对象。您可以同时避免任何order 小于您已经看到的对象。然后,您可以获取该哈希的值,这将是基于 caseID 的唯一对象,并像往常一样对它们进行排序。例如:

var json = [{   "id": 11,   "name":"app1",   "family":"apps",   "caseID": 123,   "order":1},{   "id": 12,   "name":"app1",   "family":"apps",   "caseID": 123,   "order":2},{   "id": 13,   "name":"app1",   "family":"apps",   "caseID": 123,   "order":3},{   "id": 14,   "name":"app2",   "family":"tools",   "caseID": 129,   "order":1},{   "id": 15,   "name":"app2",   "family":"tools",   "caseID": 129,   "order":2},{   "id": 16,   "name":"app3",   "family":"utils",   "caseID": 120,   "order":1},{   "id": 17,   "name":"app3",   "family":"utils",   "caseID": 120,   "order":2},{   "id": 18,   "name":"app3",   "family":"utils",   "caseID": 150,   "order":null},] 

// get just the filtered items based on caseID
// picking out only the largest
let filtered = json.reduce((a,c) => {
      if (!a[c.caseID] || a[c.caseID]['order'] < c.order) a[c.caseID] = c
      return a
  }, {})

// basic sort
let result = Object.values(filtered).sort((a,b) => b.order - a.order)
console.log(result)

【讨论】:

  • 感谢您的快速回复和解释解决方案。我从来没有想过把它分成两部分。过滤然后排序。
【解决方案2】:

如果order 更高,您可以使用caseID 哈希表并覆盖稍后找到的结果:

  const result = [], hash = {};

  for(const el in json) {
   const exists = hash[el.caseId];
   if(exists) {
     if(el.order > exists.order)
       Object.assign(exists, el);
   } else {
       result.push(hash[el.caseId] = {...el});
   }
 }

【讨论】:

    【解决方案3】:

    你可以试试关注

    方法

    1. 创建一个对象,以唯一的案例 ID 作为键,值是最高顺序的项目
    2. 按顺序排序

    // Code goes here
    
    var json = [{"id":11,"name":"app1","family":"apps","caseID":123,"order":1},{"id":12,"name":"app1","family":"apps","caseID":123,"order":2},{"id":13,"name":"app1","family":"apps","caseID":123,"order":3},{"id":14,"name":"app2","family":"tools","caseID":129,"order":1},{"id":15,"name":"app2","family":"tools","caseID":129,"order":2},{"id":16,"name":"app3","family":"utils","caseID":120,"order":1},{"id":17,"name":"app3","family":"utils","caseID":120,"order":2},{"id":18,"name":"app3","family":"utils","caseID":150,"order":null}];
      
      
      var map = {};
    
      // Create a map of unique case ID's with highest order
      json.forEach((item) => {
        if(map[item.caseID]) {
            if(map[item.caseID].order < item.order) {
              map[item.caseID] = item;
            }
        } else {
          map[item.caseID] = item;
        }
      });
      
      // Sorting the array based on order
      var result = Object.values(map).sort((a,b) => b.order-a.order);
      console.log(result);
      

    【讨论】:

      【解决方案4】:

      在 ES6 中:

      json.sort((a, b) => a.caseID > b.caseID);
      let bad_order = json.filter(v => v.order === null);
      let good_order = json.filter(v => v.order !== null);
      

      Example

      在 ES5 中:

      json.sort(function(a, b) { return a.caseID > b.caseID; });
      
      var bad_order = [];
      var good_order = [];
      
      for(var i = 0; i < json.length; i++){
        if(json[i].order === null)
          bad_order.push(json[i]);
        else
          good_order.push(json[i]);
      }
      

      Example

      【讨论】:

        【解决方案5】:

        使用reduce方法创建一个对象,其中的键将是caseID。创建对象时检查订单的值是否大于或小于当前订单值。如果当前值小于比新值,替换为新值。

        然后使用Object.values(object)从对象中创建一个值数组

        var json = [{
            "id": 11,
            "name": "app1",
            "family": "apps",
            "caseID": 123,
            "order": 1
          },
          {
            "id": 12,
            "name": "app1",
            "family": "apps",
            "caseID": 123,
            "order": 2
          },
          {
            "id": 13,
            "name": "app1",
            "family": "apps",
            "caseID": 123,
            "order": 3
          },
          {
            "id": 14,
            "name": "app2",
            "family": "tools",
            "caseID": 129,
            "order": 1
          },
          {
            "id": 15,
            "name": "app2",
            "family": "tools",
            "caseID": 129,
            "order": 2
          },
          {
            "id": 16,
            "name": "app3",
            "family": "utils",
            "caseID": 120,
            "order": 1
          },
          {
            "id": 17,
            "name": "app3",
            "family": "utils",
            "caseID": 120,
            "order": 2
          }, {
            "id": 18,
            "name": "app3",
            "family": "utils",
            "caseID": 150,
            "order": null
          }
        ]
        
        var m = json.reduce(function(acc, curr, index) {
          if (acc[curr['caseID']] === undefined) {
            acc[curr['caseID']] = curr;
        
          } else {
            if (acc[curr['caseID']].order < curr.order) {
              acc[curr['caseID']] = curr;
            }
          }
          return acc;
        }, {})
        console.log(Object.values(m))

        【讨论】:

          【解决方案6】:

          这应该可以帮助您过滤对象数组。

                      var filteredMap = {};
                      json.forEach(function (item) {
                          filteredMap[item.caseID] = item;
                      });
                      var filteredArray = [];
                      for (var key in filteredMap) {
                          filteredArray.push(filteredMap[key]);
                      }
                      console.log(JSON.stringify(filteredArray));
          

          【讨论】:

            【解决方案7】:

            按订单和caseID排序,然后按caseID过滤,代码如下:

            var json =
            [
               {
                  id: 11,
                  name:"app1",
                  family:"apps",
                  caseID: 123,
                  order:1
               },
               {
                  id: 12,
                  name:"app1",
                  family:"apps",
                  caseID: 123,
                  order:2
               },
               {
                  id: 13,
                  name:"app1",
                  family:"apps",
                  caseID: 123,
                  order:3
               },
               {
                  id: 14,
                  name:"app2",
                  family:"tools",
                  caseID: 129,
                  order:1
               },
               {
                  id: 15,
                  name:"app2",
                  family:"tools",
                  caseID: 129,
                  order:2
               },
               {
                  id: 16,
                  name:"app3",
                  family:"utils",
                  caseID: 120,
                  order:1
               },
               {
                  id: 17,
                  name:"app3",
                  family:"utils",
                  caseID: 120,
                  order:2
               }, {
                  id: 18,
                  name:"app3",
                  family:"utils",
                  caseID: 150,
                  order:null
               }
             ]
            var obj = {}
            var arr = json.sort(function(a, b) {
              return b.order - a.order
            }).sort(function(a, b) {
              return a.caseId - b.caseId
            }).filter(function(item, index, array){
              return obj.hasOwnProperty(item.caseID) ? false : (obj[item.caseID] = true)
            })
            console.log(arr)
            

            演示:http://jsbin.com/qabehorike/edit?js,console,output

            【讨论】:

              猜你喜欢
              • 2013-08-26
              • 1970-01-01
              • 2021-01-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-01-27
              • 1970-01-01
              相关资源
              最近更新 更多