JQuery是否有类似于Ruby的sort_by函数

时间:2017-05-14 06:35:42

标签: javascript jquery ruby

所以给出了像这样的项目列表:

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]

另外想要添加,关键是如果一个项目没有相关的传递category_B和sub_category_A,它应该完全从输出中排除。

3 个答案:

答案 0 :(得分:2)

你不需要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

答案 1 :(得分:1)

您可以在JavaScript中使用Array#Sort

.new-class table {
    // your styling
}

是数组中2个元素的比较。

更新:从输出中排除。您可以在排序前使用Array#filter

让我们看看我的例子

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

答案 2 :(得分:0)

ECMAScript和jQuery都没有sortByLoDash 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);
&#13;
&#13;
&#13;