0

我试图通过它们的“名称”项目对对象/数组中的项目进行排序,

我使用此页面作为参考对对象数组进行排序并构建以下代码:

var alphabet = {
    a: 1,
    b: 2,
    c: 3,
    d: 4,
    e: 5,
    f: 6,
    g: 7,
    h: 8,
    i: 9,
    j: 10,
    k: 11,
    l: 12,
    m: 13,
    n: 14,
    o: 15,
    p: 16,
    q: 17,
    r: 18,
    s: 19,
    t: 20,
    u: 21,
    v: 22,
    w: 23,
    x: 24,
    y: 25,
    z: 26
}

var test = {
    item: {
        name: "Name here",
        email: "example@example.com"
    },

    item2: {
        name: "Another name",
        email: "test@test.com"
    },

    item3: {
        name: "B name",
        email: "test@example.com"
    },

    item4: {
        name: "Z name",
        email: "example@text.com"
    }
};
test.sort(function (a, b) {return alphabet[a.name.charAt(0)] - alphabet[b.name.charAt(0)]});

console.log(test);

不幸的是,没有返回任何错误,console.log 也没有返回任何内容。任何帮助是极大的赞赏!

编辑: 给出答案后,似乎变量“test”必须是一个数组,但是,该变量是在外部库中动态生成的,因此我制作了这段小代码。如果有人有同样的问题,请随意使用它。

var temp = [];
$.each(test, function(index, value){
    temp.push(this);
});

//temp is the resulting array
4

2 回答 2

4

test是一个对象,而不是一个数组。也许你想要这个:

var test = [
    {
        name: "Name here",
        email: "example@example.com"
    },
    ⋮
];

如果您需要为每个对象保留item, item1, ... ,您可以将它们添加为每个对象的字段:

var test = [
    {
        id: "item",
        name: "Name here",
        email: "example@example.com"
    },
    ⋮
];

要按字母顺序排序,您需要一个不区分大小写的比较器(并忘记alphabet对象):

compareAlpha = function(a, b) {
  a = a.name.toUpperCase(); b = b.name.toUpperCase();
  return a < b ? -1 : a > b ? 1 : 0;
};
于 2012-04-15T23:37:37.470 回答
1

首先, test 应该是一个数组,而不是一个对象。其次,我认为您在选择字符后错过了对 .toLowerCase() 的调用。

test.sort(function (a, b) {
    return alphabet[a.name.charAt(0).toLowerCase()] - alphabet[b.name.charAt(0).toLowerCase()];
});
于 2012-04-15T23:38:12.037 回答