我有一个像这样的对象数组
array[0] = {id: 1, name: "First"}
array[1] = {id: 2, name: "Second"}
我尝试使用以下方式按name
字段进行排序:
Array.prototype.alphanumSort = function (caseInsensitive) {
for (var z = 0, t; t = ((typeof this[z] == "string" || typeof this[z] == "undefined") ? this[z] : this[z].name); z++) {
this[z] = new Array();
var x = 0, y = -1, n = 0, i, j;
while (i = (j = t.charAt(x++)).charCodeAt(0)) {
var m = (i == 46 || (i >= 48 && i <= 57));
if (m !== n) {
this[z][++y] = "";
n = m;
}
this[z][y] += j;
}
}
this.sort(function (a, b) {
for (var x = 0, aa, bb; (aa = a[x]) && (bb = b[x]); x++) {
if (caseInsensitive) {
aa = aa.toLowerCase();
bb = bb.toLowerCase();
}
if (aa !== bb) {
var c = Number(aa), d = Number(bb);
if (c == aa && d == bb) {
return c - d;
} else return (aa > bb) ? 1 : -1;
}
}
return a.length - b.length;
});
for (var z = 0; z < this.length; z++)
this[z] = this[z].join("");
}
,但是我从中返回的列表包含一个数组,其中仅包含一个name
字段,而没有相应的id
。为什么会这样呢?
有没有一种方法可以应用此算法来过滤对象?
我是JavaScript新手,请保持柔和。
答案 0 :(得分:2)
您可以将sorting with map和String#localeCompare
与options
一起使用
敏感性
字符串中的哪些差异应导致非零结果值。可能的值为:
"base"
:仅将基本字母不同的字符串视为不相等。示例:a ≠ b
,a = á
,a = A
。"accent"
:仅将基本字母或重音和其他音标不同的字符串视为不相等。示例:a ≠ b
,a ≠ á
,a = A
。"case"
:仅将基本字母或大小写不同的字符串视为不相等。示例:a ≠ b
,a = á
,a ≠ A
。"variant"
:基本字母,重音和其他变音符号或大小写不同的字符串比较不相等。也可以考虑其他差异。示例:a ≠ b
,a ≠ á
,a ≠ A
。对于用法“ sort”,默认值为“ variant”;它取决于使用“搜索”的语言环境。
数字
是否应使用数字排序规则,例如“ 1” <“ 2” <“ 10”。可能的值为
true
和false
;默认值为false
。可以通过options属性或Unicode扩展键设置此选项。如果同时提供了两者,则options
属性优先。无需实现即可支持此属性。
var array = ['Ex 10', 'Ex 2', 'a 10.1', 'a 1.1', 'a 10.0', 'a 2.0'];
array.sort((a, b) => a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' }));
console.log(array)
答案 1 :(得分:1)
您可以使用String.prototype.localeCompare
var arr = [
{id: 1, name: "Third"},
{id: 2, name: "Fifth"},
{id: 3, name: "Second"},
{id: 4, name: "Fourth"},
{id: 5, name: "First"}
];
arr.sort((a, b) => a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: 'base' }));
console.log(arr);
答案 2 :(得分:0)
您可以将比较器函数传递给javascript sort
,以使用自定义比较器对数组进行排序。添加以下代码段作为示例。
var array = [{id: 1, name: "First"}, {id: 2, name: "Second"}];
array.sort(function(x, y) {
return customCompare(x.name, y.name);
});
function customCompare(name1, name2) {
// The function should return 1, -1, 0 like any other comparator.
}
希望这会有所帮助!
答案 3 :(得分:0)
以下是使用Lodash(https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js)的示例:
array[0] = {id: 1, name: "First"}
array[1] = {id: 2, name: "Second"}
array = _.orderBy(array, 'name', 'desc')