如何按键排序对象数组?无法正确处理

Posted

技术标签:

【中文标题】如何按键排序对象数组?无法正确处理【英文标题】:How to sort array of objects by key? Unable to get it right 【发布时间】:2019-12-11 13:43:57 【问题描述】:

抱歉,如果这是一个新手问题,我正在学习 JS 和 jQuery。我试图在单击按钮后按 first_name 键对对象数组进行排序,但我没有成功。

我尝试使用 ajaxStyling 类获取 div。然后为 id 为 #btn-click 的按钮插入相邻的 html。然后我使用jQuery劫持点击并尝试使用newCourse.students(我的对象数组/在执行console.log时工作)的函数进行排序,但整个排序函数不起作用。我在控制台上没有收到错误,但文本不会排序。也许是我的回报?还是我需要再次追加?

  $('#btn-click').on('click', (e) => 
          e.preventDefault()
          // console.log(newCourse.students)
          newCourse.students.sort(function(a, b) 
            // return a.first_name > b.first_name;

            var nameA = a.first_name.toUpperCase();
            var nameB = b.first_name.toUpperCase();
            if (nameA < nameB) 
              return -1;
            
            if (nameA > nameB) 
              return 1;
            
            return 0;
          );
          newCourse.students
        )

当我登录 newCourse.students 时得到什么

(3) […, …, …]
0: id: 11, first_name: "Stefan", last_name: "Candelaria", …
1: id: 12, first_name: "Robby", last_name: "Pasurin", …
2: id: 10, first_name: "Rafa", last_name: "Lopez", …
length: 3

我的html。想在点击按钮后按名称排序,实现以下顺序 1.Rafa Lopez 2.Robby Pasurin 3.Stefan Candelaria ...而不是下面的顺序。

<div class="container">
    <div class="ajaxStyling">
  <a href="/courses/6" data-id="6"><h3 class="showText">Adobe Analytics 201 by Adam Greco</h3></a>
  <p class="show_link">Stefan Candelaria</p>
  <p class="show_link">Robby Pasurin</p>
  <p class="show_link">Rafa Lopez</p>
</div>
<button id="btn-click">Click Me!</button>
</div>

【问题讨论】:

你认为newCourse.students 会做什么? 您对数组进行排序,但不确定 HTML 与数组排序有何关系。如果你说它是颠倒的,听起来你会把 1 和 -1 的逻辑颠倒过来。 newCourse.students 正在呼叫学生,这是课程的一个属性。我试过你的记录,但没有用:( 看起来您在排序之前正在登录。 click 函数的最后一行没有做任何事情,但这就是你应该对数组做一些事情的地方。 【参考方案1】:

单击按钮后按名称排序

function myFunction() 
 $('.show_link').sort(function(a, b) 
  if (a.textContent < b.textContent) 
    return -1;
   else 
    return 1;
  
).appendTo('body');

<div class="container">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>    
<div class="ajaxStyling" id="ajaxStyling">
  <a href="/courses/6" data-id="6"><h3 class="showText">Adobe Analytics 201 by Adam Greco</h3></a>
  <p class="show_link">Stefan Candelaria</p>
  <p class="show_link">Robby Pasurin</p>
  <p class="show_link">Rafa Lopez</p>
</div>
<button id="btn-click" onclick="myFunction()">Click Me!</button>
</div>

【讨论】:

【参考方案2】:

我会告诉你基本的想法,因为我是在手机上打字的。

这里是排序方式:

let arrUsers = [
  id: 12, first_name: "Robby", last_name: "Pasurin",
id: 13, first_name: "Bobby", last_name: "Pasurin"
];

arrUsers.sort((objUser1, objUser2) => 
  let sFirstName = objUser1.first_name.toLowerCase(), sSecondName = objUser2.first_name.toLowerCase();

return sFirstName !== sSecondName ? sFirstName < sSecondName ? -1 : 1 : 0;
);

console.log(arrUsers);

您可以像这样构建 html 迭代此结果:


$('#users').html('');

let arrUsers = [
  id: 12, first_name: "Robby", last_name: "Pasurin",
id: 13, first_name: "Bobby", last_name: "Pasurin"
];

arrUsers.sort((objUser1, objUser2) => 
  let sFirstName = objUser1.first_name.toLowerCase(), sSecondName = objUser2.first_name.toLowerCase();

return  sFirstName !== sSecondName ? sFirstName < sSecondName ? -1 : 1 : 0;
).map(objUser => $('#users').append(`<p>$objUser.first_name</p>`));

&lt;p&gt;标签放置在div中的示例html:

<body>
  <a></a>
  <div id="users">

  </div>
</body>

【讨论】:

太棒了,我搞砸了不使用 map 方法和附加,所以这非常有帮助。非常感谢。

以上是关于如何按键排序对象数组?无法正确处理的主要内容,如果未能解决你的问题,请参考以下文章

按键分组对象数组 - javascript

vue js 不按键对数组进行排序

请问js中对象数组求和代码怎么实现?

javascript 如何在javascript数组中按键和值查找对象的索引

如何按键对一组对象进行分组?

如何按键对一组对象进行分组?