【问题标题】:Does JQuery have a sort_by function similar to Ruby'sJQuery 是否有类似于 Ruby 的 sort_by 函数
【发布时间】:2017-05-14 20:22:54
【问题描述】:

所以给定一个像这样的项目列表:

item_1 = {id:1, categories: {"category_A" => 1, "category_B" => {"sub_category_A" => 3, "sub_category_B" => 1}}}
item_2 = {id:2, categories: {"category_B" => {"sub_category_A" => 1, "sub_category_B" => 2}}}

其中数值是项目在给定子类别或主要类别中的顺序。现在,给定子类别或主要类别,我想按订单号对项目进行排序。在 Ruby 中我会写...

# Given category_B and sub_category_A
items.sort_by { |i| i.categories["category_B"]["sub_category_A"] }

# which would return...
[item_2, item_1]

还想补充,关键是如果一个item没有相关传递的category_B和sub_category_A,应该完全排除在输出之外。

【问题讨论】:

    标签: javascript jquery ruby


    【解决方案1】:

    你不需要 jQuery; JavaScript 数组有一个 filter() 函数,您可以使用它来将自己限制为有效项目,以及一个 sort() 函数,它可以将比较函数作为其参数:

    var item_1 = {
        id:1, 
        categories: {
            "category_A" : 1,
            "category_B" : {
                "sub_category_A" : 3,
                "sub_category_B" : 1
            }
        }
    };
    var item_2 = {
        id:2,
        categories: {
            "category_B" : {
                "sub_category_A" : 1,
                "sub_category_B" : 2
            }
        }
    };
    
    var item_3 = {
        id: 3,
        categories : {
            "category_A" : 2
        }
    };
    
    [item_1,item_2,item_3].filter(function(entry) {
      return entry.categories.category_B;}).sort(function(left, right) {
      return left.categories["category_B"]["sub_category_A"] -
        right.categories["category_B"]["sub_category_A"]
    });
    
    // or in the more readable ES6 style
    [item_1,item_2,item_3]
        .filter((entry) => entry.categories.category_B)
        .sort((left, right) =>  left.categories["category_B"]["sub_category_A"] - right.categories["category_B"]["sub_category_A"]
    );
    

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

    【讨论】:

    • 您将如何进一步修改排序以考虑可能没有 category_b 的项目?
    【解决方案2】:

    您可以在 JavaScript 中使用Array#Sort

    a.categories["category_B"]["sub_category_A"] - b.categories["category_B"]["sub_category_A"]
    

    是Array中2个元素的比较。

    UPDATE:从输出中排除。你可以在排序前使用Array#filter

    让我们看看我的例子

    var arr = [{
          id:1, 
          categories: 
          {
            "category_A" : 1, 
            "category_B" : {
              "sub_category_A" : 3, 
              "sub_category_B" : 1
              }
             }
          },{
          id:3, 
          categories: {
            "category_C" : {
              "sub_category_A" : 1, 
              "sub_category_B" : 2
              }
          }
        },{
          id:2, 
          categories: {
            "category_B" : {
              "sub_category_A" : 1, 
              "sub_category_B" : 2
              }
          }
        }];
    
        var result = arr.filter(a => a.categories["category_B"])
                        .sort((a, b) => {
          return a.categories["category_B"]["sub_category_A"] - b.categories["category_B"]["sub_category_A"];
        })
    
        console.log(result);

    【讨论】:

    • 您将如何进一步修改排序以考虑可能没有 category_b 的项目?
    • 查看我的编辑答案。您可以在排序前过滤数组
    【解决方案3】:

    ECMAScript 和 jQuery 都没有 sortBy,但 LoDash doesUnderscore 也是。

    自己提供也不难:

    Array.prototype.sortBy = function sortBy(keyFn) {
      const compare = (a, b) => a > b ? 1 : (a < b ? -1 : 0);
      return this.
        map(el => [keyFn(el), el]).
        sort(([a, ], [b, ]) => compare(a, b)).
        map(([, el]) => el);
    };
    
    const item1 = { id: 1, categories: { category_A: 1, category_B: { sub_category_A: 3, sub_category_B: 1 }}};
    const item2 = { id: 2, categories: { category_B: { sub_category_A: 1, sub_category_B: 2 }}};
    
    const sorted = [item1, item2].sortBy(el => el.categories.category_B.sub_category_A);
    
    console.log(sorted);

    【讨论】:

      猜你喜欢
      • 2013-12-11
      • 1970-01-01
      • 2012-01-21
      • 2010-11-27
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多