按属性长度对对象数组进行排序

4

我有这个数组:

var itemList = [
    {
        image: "images/home.jpg",
        name: "Home"
    },
    {
        name: "Elvis",
    },
    {
        name: "Jonh"
    },
    {
        image: "images/noah.jpg",
        name: "Noah"
    },
    {
        name: "Turtle"
    }
]

如何将数组组织成具有图像属性的对象,使其首先显示图像属性,从而看起来像这样:
var itemList = [
    {
        image: "images/home.jpg",
        name: "Home"
    },
    {
        image: "images/noah.jpg",
        name: "Noah"
    },
    {
        name: "Elvis",
    },
    {
        name: "Jonh"
    },
    {
        name: "Turtle"
    }
]

@Andreas 不,我需要检查该属性是否存在,而不是对它们进行排序。 - Caio Kawasaki
2
这些名称正确吗?你有 imageimagemnamenome 吗? - Nicholas Robinson
@NicholasRobinson 哎呀,修正了... - Caio Kawasaki
可能是如何按属性值长度排序具有对象的数组?的重复问题,但是你的问题不够清晰,因为被接受的答案实际上根本没有检查长度,并且将具有“image”属性的元素按它们在数组中出现的顺序排序。 - Heretic Monkey
3个回答

5

这段代码将具有属性'image'的元素放在开头,其他元素保持原有顺序。

function compare(a,b) {
   if ('image' in a) {
       return 1;
   } else if ('image' in b) {
      return -1;
   } else {
      return 0;
   }
}

itemList.sort(compare);

1
只需要检查,如果图像存在于两个函数中,则需要返回0。 - Nicholas Robinson
如果两个元素都包含图像,则返回1保证它们的顺序不变。返回0可能会改变这两个元素之间的顺序。 - Davide Lorenzo MARINO

1

试试这个:

function compare(a,b) {
  if (a.image && b.image)
    return 0;
  if (a.image)
    return 1;
  return -1;
}

objs.sort(compare);

1
这不是情况,但如果属性存在并且其值可以被计算为true,a.image就不会返回true。例如,如果属性存在且字符串为空,则值为false;如果属性为布尔类型且值为false,则返回false。 - Davide Lorenzo MARINO
1
Ecma表示:关于字符串的布尔转换:“如果参数为空字符串(长度为零),则返回false;否则返回true。”同样,null值被转换为false。 - Davide Lorenzo MARINO

0
有点晚了,但还有另一种选择:
itemList.sort(function(e1,e2){ return  (e1.image === undefined) - (e2.image === undefined); });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接