首先按布尔列对数组进行排序,然后按字符串列排序
Posted
技术标签:
【中文标题】首先按布尔列对数组进行排序,然后按字符串列排序【英文标题】:Sort an array first by boolean column then by string column 【发布时间】:2018-06-03 21:13:21 【问题描述】:我正在尝试按 2 个字段对数组进行排序。我有一个布尔值:isFavorite 和一个字符串:名称。 所有为真的布尔值都必须是第一项。但我希望数组按字母顺序排列。这是我到目前为止的代码(尝试了多种方法):
data.sort(function (x,y)
if (x.isFavorite)
return -1;
if (x.isFavorite && !y.isFavorite && (x.name < y.name))
return -1;
else if ((x.isFavorite === y.isFavorite) && (x.name === y.name))
return 0;
else if (x.isFavorite && y.isFavorite && (x.name < y.name))
return -1;
else if (!x.isFavorite && !y.isFavorite && (x.name > y.name))
return 1;
【问题讨论】:
javascript sort array by two fields的可能重复 【参考方案1】:您的问题是前两个if
重叠,如果x.isFavorite
是true
,则第二个if
不可达,那么第一个if
将return
。
此外,您没有检查某些情况,例如 y.isFavorite
是 true
而 x.isFavorite
不是。
你可以写成
if ( x.isFavorite != y.isFavorite )
return x.isFavorite ? -1 : 1;
else
return x.name.localeCompare( y.name );
【讨论】:
【参考方案2】:为什么会有这么多条件和重叠?
只需使用logical OR
运算符即可按两个字段对数组进行排序。
另外,我使用+ (Boolean)
来强制转换为数字。
grouperArray.sort((a, b) => (+a.isFavorite) - (+b.isFavorite) || a.name.localeCompare(b.name));
let data = [ isFavorite:false, name:'A' , isFavorite:true, name:'C' , isFavorite:true, name:'B' ];
data.sort((a,b) => (+b.isFavorite) - (+a.isFavorite) || a.name.localeCompare(b.name));
console.log(data);
【讨论】:
很好的答案!,+1【参考方案3】:给你:)
var arr = [
isFavorite: false,
name: 'a'
,
isFavorite: true,
name: 'b'
,
isFavorite: true,
name: 'c'
,
isFavorite: false,
name: 'c'
];
arr.sort(function (x,y)
if (x.isFavorite > y.isFavorite)
return -1;
else if(x.isFavorite == y.isFavorite)
return x.name > y.name;
else
return 1;
);
console.log(arr);
【讨论】:
【参考方案4】:const data = [
isFavorite: false, name: 'b',
isFavorite: false, name: 'f',
isFavorite: true, name: 'c',
isFavorite: true, name: 'a',
isFavorite: false, name: 'd',
isFavorite: true, name: 'g'
];
const sortedData = data.sort((a, b) =>
if (a.isFavorite !== b.isFavorite)
return a.isFavorite ? -1 : 1;
else
return a.name > b.name ? 1 : -1;
);
console.log(sortedData);
【讨论】:
【参考方案5】:试试这个:
const data = [
isFavorite: false, name: 'B',
isFavorite: false, name: 'A',
isFavorite: true, name: 'C',
isFavorite: true, name: 'D',
isFavorite: true, name: 'A',
isFavorite: false, name: 'A',
isFavorite: false, name: 'D',
isFavorite: true, name: 'Z',
];
const compareLoc = (a, b) => a.name.localeCompare(b.name)
const result = [...data.filter(d => d.isFavorite).sort(compareLoc),
...data.filter(d => !d.isFavorite).sort(compareLoc)];
console.log(result);
以下 sn-p 作品。
const data = [
isFavorite: false, name: 'B',
isFavorite: false, name: 'A',
isFavorite: true, name: 'C',
isFavorite: true, name: 'D',
isFavorite: true, name: 'A',
isFavorite: false, name: 'A',
isFavorite: false, name: 'D',
isFavorite: true, name: 'Z',
];
data.sort(function (x, y)
// if both are true or false, we should compare name attributes
if (x.isFavorite === y.isFavorite)
return x.name.localeCompare(y.name);
return x.isFavorite ? -1 : 1
)
console.log(data)
【讨论】:
这几乎对我有用,奇怪的是,除了在我的下拉列表(数组)的底部之外,一切正常,我有一些项目没有像这样排序:az,a , c, f, g , w => 所以第一部分非常好,但在 Z 之后就像 10 个项目,又从“a”开始 这并不奇怪,他不对数组的末尾进行排序。您应该对条件的每个案例进行排序,而他只在 if 语句中这样做。将 if 的代码复制/粘贴到 else 中及其下方,它应该可以工作 您可以发布 sn-p 以进行澄清吗?我做了我认为你的意思,但没有用 我没有得到确切的意思,你不需要 isFavorite(a-z) 然后 !isFavorite(a-z) 吗?为什么 a-z 出现在 a-z 之后是我在所有情况下都将 isFavorite = true 排序在 false 之前 你能检查一下我刚才分享的上面的sn-p吗以上是关于首先按布尔列对数组进行排序,然后按字符串列排序的主要内容,如果未能解决你的问题,请参考以下文章