javascript - 使用额外的变量在过滤器 JavaScript 中进行排序

标签 javascript arrays

我处于一个令人困惑的情况,我正在过滤一个数组并对它们进行排序,但我需要以可以访问变量的方式进行过滤。

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/

相关文章:

javascript - 在 rails 4.0 上使用 javascript 更改图像

javascript + css div折叠效果

java - 获得数组幂集的最佳方法?

arrays - 使用 JSON 数组和 JSON 对象有什么区别?

python - 在 Numpy 数组中使用字典 dosent 使该数组具有单一数据类型

javascript - 是否可以更改Image2 ckeditor插件中Image的Wrapper "<div>"?

javascript - For 循环迭代 < vs <= JavaScript 基础

javascript - 如何从方法返回字符串?

python - 带有 bool 语句的 Numpy 向量化函数赋值

javascript - react : How to pass array of ids to method