我处于一个令人困惑的情况,我正在过滤一个数组并对它们进行排序,但我需要以可以访问变量的方式进行过滤。
products.filter(function(product) {
// some product have primaryName some second name, need to sort by primaryName if there is one,
var universalName = product.attr('primaryName') || product.attr('name');
return product;
})
.sort(function (a,b) {
// how do I sort here so that primaryName is sorted too if there is one, so how can I access variable universalName here?
return a.attr('name').localeCompare(b.attr('name'));
如您所见,如果有primaryName,我需要按primaryName 排序,如果没有primaryName,则只需按始终存在的名称排序。我的想法已经用完了。
最佳答案
how can I access variable universalName here?
你不能,有多少个 universalName
变量就有多少个条目(每次调用 filter
的回调都会创建一个变量),而且它们都是回调私有(private),并在调用 sort
之前删除。
如果条目有混合,最简单的事情可能就是重复您的||
:
products.sort(function(a, b) {
return (a.attr('primaryName') || a.attr('name')).localeCompare(b.attr('primaryName') || b.attr('name'));
});
或者更容易阅读/调试(任何像样的 JavaScript 引擎都会对此进行优化):
products.sort(function(a, b) {
var aname = a.attr('primaryName') || a.attr('name');
var bname = b.attr('primaryName') || b.attr('name');
return aname.localeCompare(bname);
});
请注意,我已经完全删除了您的 .filter
,因为它保留了所有条目,因此不需要它。
不适合您的情况,但只是为了完整性:有时,如果检查非常昂贵并且避免重复很重要,则值得遍历数组来进行检查和映射元组的条目包含原始条目加上值,然后排序,然后再次映射以返回到原始形式,如下所示:
products
.map(function(product) {
return {product: product, name: product.attr('primaryName') || product.attr('name')};
})
.sort(function(a, b) {
return a.name.localeCompare(b.name);
})
.map(function(entry) {
return entry.product;
});
或者在 ES2015+ 中
products
.map(product => ({product, name: product.attr('primaryName') || product.attr('name')}))
.sort((a, b) => a.name.localeCompare(b.name))
.map(({product}) => product);
但是您的 a.attr('primaryName') || 不需要这种开销a.attr('name')
检查。
关于javascript - 使用额外的变量在过滤器 JavaScript 中进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50470639/