L1g*_*ira 4 javascript arrays sorting object
我试图通过属性对对象数组进行排序.我跑:
array.sort(function(a, b){
var textA = a.name.toUpperCase();
var textB = b.name.toUpperCase();
return (textA < textB) ? -1 : (textA > textB) ? 1: 0
});
Run Code Online (Sandbox Code Playgroud)
首先按字母顺序对数组对象进行排序,然后使用自定义比较函数运行array.sort,如下所示:
array.sort(function(a, b){
if(a.name === b.name){
return -1;
}
return 1;
});
Run Code Online (Sandbox Code Playgroud)
它似乎适用于没有重复的任何对象,但是,只要有双打它就将它们全部推送到数组的末尾而不仅仅是附加内容.
例:
[
{name: 'Amy'},
{name: 'Amy'},
{name: 'Clark'},
{name: 'Clark'},
{name: 'Dan'},
{name: 'Dave'}
{name: 'Joe'},
{name: 'Joe'}
]
Run Code Online (Sandbox Code Playgroud)
预期产出:
实际结果:
排序代码尝试获得预期结果
array.sort(function(a,b){
if(a.name === b.name){return -1}
return 1;
});
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,带有比较功能的array.sort可以处理这个但是我继续玩返回值0,-1,1并且似乎无法让它完全按照我的意愿工作.
更新
预期成果标准:
如果对象具有相同的名称,则副本应该到达数组的末尾.例如,如果有两个'Amy',那么一个停留在数组的开头,副本就会结束.因此,所有第一次出现的名称都将在数组的开头,并且每次在数组末尾都将重新排序所有双精度数,三重等.这样它就可以安排alhpabetical多项.
例:
[
{name: 'Amy'},
{name: 'Amy'},
{name: 'Clark'},
{name: 'Clark'},
{name: 'Clark'},
{name: 'Dan'},
{name: 'Dave'},
{name: 'Joe'},
{name: 'Joe'},
{name: 'Joe'},
]
Run Code Online (Sandbox Code Playgroud)
预期结果:
艾米克拉克丹戴夫乔艾米 - 复制克拉克 - 复制乔 - 复制克拉克 - 有第三个乔 - 有第三个
正如您所看到的,它按字母顺序排列所有名称的第一个匹配顺序.然后按字母顺序排序第二次,然后排第三次.直到所有重复项都得到解决.
在评论中讨论后,我的理解是它不能单独在array.sort函数中完成.单独使用比较函数排序似乎对单个或分组双精度有好处,但不适用于在数组末尾放置双精度数.
您的比较器功能不正确.该功能必须:
因为你的不一致,排序过程会混淆.对于您的情况,最简单的方法是使用.localeCompare()函数,它会返回您需要的结果:
array.sort(function(a, b) { return a.name.localeCompare(b.name); });
Run Code Online (Sandbox Code Playgroud)
根据您的"预期产量",您的订购标准尚不清楚.在任何情况下,排序比较器,无论它做什么,都必须是一致的:当两个项以任意顺序传递给它时,该函数应报告相同的顺序.
编辑如果原始排序具有一些语义含义,并且"双打"(我称之为"重复")应该在数组中进一步向下排序,您可以向捕获原始状态的每个对象添加另一个属性:
var keyMap = {};
array.forEach(function(item) {
if (item.name in keyMap)
item.position = ++keyMap[item.name];
else
keyMap[item.name] = item.position = 1;
});
Run Code Online (Sandbox Code Playgroud)
现在您可以排序:
array.sort(function(a, b) {
var c = a.position - b.position;
if (c) return c;
return a.name.localeCompare(b.name);
});
Run Code Online (Sandbox Code Playgroud)
如果"位置"值相同,则将按名称对项目进行排序.在原始数组中重复的项目将在非项目之后进行排序(并且三次之后将对这些项目进行排序等).
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |