gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:02:08 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com