【问题标题】:How to sort an array in JavaScript or jQuery with multiple objects per array record如何在 JavaScript 或 jQuery 中使用每个数组记录的多个对象对数组进行排序
【发布时间】:2018-12-28 05:46:22
【问题描述】:

在你投反对票之前:我已经检查了围绕这个问题的所有现有解决方案,但没有一个与此类似。

我想按 image.name(JavaScript 或 jQuery)的字母顺序对这个数组进行排序:

var myArray = [{
    creator: {
      "firstname": "Sally",
      familyname: "Bloomfield"
    },
    location: {
      "lat": 12.123,
      lng: 8.846
    },
    image: {
      name: "Hello World",
      size: "50x80"
    }
  },
  {
    creator: {
      firstname: "Bob",
      familyname: "Jones"
    },
    location: {
      lat: 31.593,
      lng: 96.376
    },
    image: {
      name: "Flowerpower",
      size: "40x50"
    }
  },
  {
    creator: {
      firstname: "John",
      familyname: "Walker"
    },
    location: {
      lat: 27.184,
      lng: 123.120
    },
    image: {
      name: "Guiness",
      size: "33x66"
    }
  }
];

排序后的数组输出:

[{
    creator: {
      firstname: "Bob",
      familyname: "Jones"
    },
    location: {
      lat: 31.593,
      lng: 96.376
    },
    image: {
      name: "Flowerpower",
      size: "40x50"
    }
  },
  {
    creator: {
      firstname: "John",
      familyname: "Walker"
    },
    location: {
      lat: 27.184,
      lng: 123.120
    },
    image: {
      name: "Guiness",
      size: "33x66"
    }
  },
  {
    creator: {
      firstname: "Sally",
      familyname: "Bloomfield"
    },
    location: {
      lat: 12.123,
      lng: 8.846
    },
    image: {
      name: "Hello World",
      size: "50x80"
    }
  }
]

所以首先图像 Flowerpower 然后 Guiness 然后 Hhello World。

现有的 Javascript 排序功能无法处理,因为我已经尝试过了。甚至可以对这样的结构进行排序吗?

感谢任何帮助。

【问题讨论】:

  • 您可以将自己的比较器传递给 JavaScript 排序函数
  • @Jacob:我已经通过发送“image.name”做到了这一点,但被忽略了。
  • 你能分享你的代码吗?
  • @Jacob:我使用的是 Bob 的 sortOn 函数:stackoverflow.com/questions/979256/… 然后我就是这样使用的:sortOn (myArray, image.name, false, false);

标签: javascript jquery arrays sorting object


【解决方案1】:

您可以在对字符串进行排序时使用localeCompare。那么使用Array.sort()就行了:

var myArray = [{creator: { "firstname": "Sally", familyname: "Bloomfield"},location: { "lat": 12.123, lng: 8.846},image: {name: "Hello World", size: "50x80"}},{creator: { firstname: "Bob", familyname: "Jones"},location: { lat: 31.593, lng: 96.376},image: {name: "Flowerpower", size: "40x50"}},{creator: { firstname: "John", familyname: "Walker"},location: { lat: 27.184, lng: 123.120},image: {name: "Guiness", size: "33x66"}}];

myArray.sort((a,b) => a.image.name.localeCompare(b.image.name))
console.log(myArray)

【讨论】:

  • 也感谢您提供正确的解决方案,特别是考虑到 localeCompare! 1up!
  • @Jonny 如果您想确保带有重音符号的名称继续有效,您应该使用localeCompare 而不是选择的答案。其他解决方案会将émile 之类的名称放在列表末尾,而不是其他es。
【解决方案2】:
myArray.sort(function(a, b) {
    if (a.image.name === b.image.name) {
        return 0;
    }
    return a.image.name < b.image.name ? -1 : 1;
});

【讨论】:

  • 第一个正确答案!不知道在内部排序函数中使用像 image.name 这样的对象访问。
【解决方案3】:

您可能会遇到问题,因为您的数组中有错字。 line 14 上有一个单独的双引号 "

当我删除额外的引号时,这对我有用:

var myArraySorted = myArray.sort((a, b) => {
   if (a.image.name < b.image.name) {
       return -1
   }
   return 1;
});

【讨论】:

  • Array.sort() 对原件进行就地排序。您不需要将结果分配给任何东西。
  • 谢谢,已更正。是我放在一起的一个简化的数组示例。
【解决方案4】:

Array.prototype.sort() 函数的参数比较项目并将它们的索引按字母顺序移动type String 和数字移动type Number。当您对Object 进行排序时,您需要插入您希望定位的特定属性,就像这样...

function compare(a, b) {
    return a.image.name === b.image.name ? 0 :
        a.image.name < b.image.name ? -1 : 1;
}

var sorted = myArray.sort(compare);

希望对您有所帮助:D

Array.sort @ MDN

【讨论】:

  • 以这种方式对字符串进行排序的问题在于,它无法对ElleÉtienne 之类的字符串进行合理处理。
猜你喜欢
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2018-07-07
  • 2023-01-19
相关资源
最近更新 更多