JavaScript 中根据两个属性对对象数组进行排序


给定问题要求根据两个属性对给定的对象数组进行排序,并用 JavaScript 创建一个程序。

理解问题

让我们深入了解一下问题陈述。您将获得一个包含键值对的对象数组。根据问题陈述,我们需要该数组的排序形式。为了实现此问题,我们将首先对数组的第一列进行排序,然后对数组的第二列进行排序。然后再次将其排列成排序形式。

正如我们所知,数组是计算机科学中的基本数据结构。数组也可以是对象的集合,这些对象可以是键值对。其中键将定义数组中值的类型。因此,借助键,我们可以访问它并执行排序操作。

在我们的项目中,我们将用两种方法解决这个问题。

算法 - 第一种方法

步骤 1:在理解逻辑之前,首先定义一个包含对象的数组。数组是程序的初始点,因此首先了解我们将要使用的数组。在我们的第一个程序中,数组的名称将为 details,此处 name 和 age 被定义为键及其值。

步骤 2:此步骤将对定义的数组执行排序操作。在此步骤中,排序后的数据将传递给 afterSorting 变量。在最后一步,我们将使用 afterSorting 打印结果。

步骤 3:此步骤将遍历多个 if 语句。在第一行,它将检查 name 的前两个值,如果第一个值小于第二个值,则返回 -1,在第二行,它将检查与第一行完全相反的内容。

步骤 4:此步骤也将执行多个 if 语句并检查 age 的值。如果 age 的第一个值小于第二个值,则返回 -1,否则返回 1。

步骤 5:此步骤将返回更新后的排序后的对象数组的值。

示例

//define array
const details = [
  { name: 'Preeti', age: 25 },
  { name: 'Aman', age: 30 },
  { name: 'Shekhar', age: 20 },
  { name: 'Preeti', age: 25 },
  { name: 'Aman', age: 25 },
  { name: 'Anjali', age: 22 },
  { name: 'Kajal', age: 28 },
  { name: 'Anjali', age: 22 },
  { name: 'Shekhar', age: 20 },
];

const afterSorting = details.sort((first, second) => {
  if (first.name < second.name) return -1;
  if (first.name > second.name) return 1;
   if (first.age < second.age) return -1;
  if (first.age > second.age) return 1;
  return 0;
});

console.log(afterSorting);

输出

[
  { name: 'Aman', age: 25 },
  { name: 'Aman', age: 30 },
  { name: 'Anjali', age: 22 },
  { name: 'Anjali', age: 22 },
  { name: 'Kajal', age: 28 },
  { name: 'Preeti', age: 25 },
  { name: 'Preeti', age: 25 },
  { name: 'Shekhar', age: 20 },
  { name: 'Shekhar', age: 20 }
]

算法 - 第二种方法

此方法在编码和语法方面与上述方法略有不同。

步骤 1:在初始步骤中,我们需要定义一个数组。在我们的例子中,我们有一个名为 languages 的数组,其中我们定义了两个属性:name 和 difficulty。因此,此数据是不言自明的。

步骤 2:这是我们程序中逻辑的第一步。我们在 const 中定义了一个名为 sortedArray 的变量。此函数获取要排序的数据并将其结果数组存储在其中。然后,我们创建了 if else 语句来根据程序要求检查条件。

示例

// define array named languages with name and difficulty 
const languages = [
   {name: "Python", difficulty: "Easy"},
   {name: "Java", difficulty: "Tough"},
   {name: "Javascript", difficulty: "Medium"},
   {name: "Javascript", difficulty: "Average"},
   {name: "Python", difficulty: "moderate"},
   {name: "HTML", difficulty: "Easy"},
   {name: "CSS", difficulty: "Medium"},
   {name: "HTML", difficulty: "Effortless"}];

const sortedArray = languages.sort((a, b)=> {
  if (a.name === b.name){
   return a.difficulty < b.difficulty ? -1 : 1
  } else {
   return a.name < b.name ? -1 : 1
  }
})

console.log("Array of objects after sorting");
console.log(sortedArray);

输出

Sort Array of objects by two properties
[
  { name: 'CSS', difficulty: 'Medium' },
  { name: 'HTML', difficulty: 'Easy' },
  { name: 'HTML', difficulty: 'Effortless' },
  { name: 'Java', difficulty: 'Tough' },
  { name: 'Javascript', difficulty: 'Average' },
  { name: 'Javascript', difficulty: 'Medium' },
  { name: 'Python', difficulty: 'Easy' },
  { name: 'Python', difficulty: 'moderate' }
]

复杂度

在上述算法中,我们最初使用了 Javascript 的 sort 方法,该方法需要 O(n) 时间来对长度为 n 的对象进行排序,然后是 if 条件,这些条件又需要最多对象长度的时间来对对象进行排序。因此,在将两者相加后:O(n) + O(n) = O(2n)。在 O(2n) 中,2 是常数,在复杂度中,常数无关紧要,因此结果将为 O(n) 时间。占用的空间复杂度为 O(n)。

结论

这就是我们如何解决给定问题的方法,逻辑思维是获得解决任何问题思路的关键。在编码的背景下,从针对特定问题陈述(对对象数组进行排序)的简单的 javascript 一行排序方法开始。

更新于:2023 年 8 月 18 日

2K+ 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告