JavaScript数组过滤后如何按primaryName优先、name次之排序
嘿,我完全懂你的困扰!你在filter回调里定义的universalName没法在sort里用,本质是函数作用域的问题——每个回调函数都有自己的独立作用域,变量没法跨回调共享。不过没关系,有几个简单靠谱的办法能实现你要的「优先按primaryName排序,没有则用name」的逻辑:
方法1:在sort回调里直接计算通用名称
这是最直接的方式,不需要依赖filter里的变量,直接在sort的时候对每个元素重新判断优先用哪个名称:
products.filter(function(product) { // 这里放你的实际过滤条件,如果只是保留所有产品的话,这个filter其实可以省略 return true; }) .sort(function(a, b) { // 对a和b分别获取优先名称 const nameA = a.attr('primaryName') || a.attr('name'); const nameB = b.attr('primaryName') || b.attr('name'); // 用localeCompare做字符串排序 return nameA.localeCompare(nameB); });
方法2:抽离通用名称的获取逻辑(推荐)
如果以后这个「优先取primaryName,没有则取name」的逻辑需要修改,抽成独立函数可以避免重复改代码:
// 单独定义工具函数,统一处理名称获取逻辑 function getProductDisplayName(product) { return product.attr('primaryName') || product.attr('name'); } products.filter(function(product) { // 你的过滤条件 return true; }) .sort(function(a, b) { const nameA = getProductDisplayName(a); const nameB = getProductDisplayName(b); return nameA.localeCompare(nameB); });
补充说明
你之前的filter代码里return product其实等价于return true(因为jQuery对象是真值),如果没有实际的过滤需求,可以直接去掉filter,直接对products执行sort操作就行。
内容的提问来源于stack exchange,提问作者Dhiraj
相关产品推荐
相关产品推荐

