GVKun编程网logo

sort方法实际应用详解---javascript中对一个对象数组按照对象某个属性进行排序

11

如果您想了解sort方法实际应用详解---javascript中对一个对象数组按照对象某个属性进行排序的知识,那么本篇文章将是您的不二之选。同时我们将深入剖析JavaScriptES6实现一个对象数组

如果您想了解sort方法实际应用详解---javascript中对一个对象数组按照对象某个属性进行排序的知识,那么本篇文章将是您的不二之选。同时我们将深入剖析JavaScript ES6实现一个对象数组按照另一个对象数组进行排序、javascript – 使用另一个对象数组过滤对象数组、javascript – 如何将一个对象数组拆分成多个普通数组,其中每个数组都由一个属性的值填充?、javascript – 如何根据另一个数组的顺序对对象数组进行排序?的各个方面,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

sort方法实际应用详解---javascript中对一个对象数组按照对象某个属性进行排序

sort方法实际应用详解---javascript中对一个对象数组按照对象某个属性进行排序

转载: 查看原文

在javascript中,对象和数组是两种不同的类型,这和php中的数组概念不同。在javascript中,也有一些精妙的算法,用来对一些对象进行排序。我在面试迅雷的时候,也拿到一道题,当时做题的时候考虑到时间,没有去仔细研究,回来后再读了一些方法,就知道真正的考点在哪里了。

我们现在有一组“学生”对象,包含“名字,年龄”等属性,现在要求一个算法,把这些对象放在一个数组里,可以实现按照年龄对这些对象进行排序。

var sdts = [
  { name:"小明", age:12 },
  { name:"小红", age:13 },
  { name:"小花", age:11 }
]

 

那么考点在哪里呢?实际上在于数组对象的sort方法。

 sdts.sort(fun) 

fun是一个函数,排序根据这个函数返回值来进行判断,如果返回值小于0表示两个元素不需要交换位置,1表示要用交互位置,0表示相等,实际上<=0等效。

sort方法有两个注意点:

  1. 会操作原始数组,经过操作后原始数组发生变化
  2. 默认排序按照字符编码排序,例如,我们有下面的一个例子:
var arr1 = [14,23,11,6,87,67];
arr1.sort();// [11,14,23,6,67,87] 按字符而非数值排序

 

想要完成值比较排序,必须传入sort参数(函数)进行规则制定:

function sortRule(a, b) {
  return a - b; // 如果a>=b,返回自然数,不用交换位置
}
arr1.sort(sortRule);

 

但是,如果遇到我们上面题目中一样,每个元素并非是数组,而是对象,那应该怎么去处理呢?其实道理是一样的,只不过我们要在规制函数中重新编写一个适合对象的规制:

functon sortRule(a, b) {
  return a.age - b.age;
}

 

当然,这样写会遇到一些问题,这是我们在明确知道要进行排序的对象数组的情况,倘若对象数组元素不存在age属性,那就会报错了,因此,你在撰写自己的规则时,应该更加丰富它的规则判断。

加入我们现在不规定按照哪一个属性排序,比如除了age属性,我们还有学生的分数score属性,我们偶尔需要按照年龄排序,偶尔又需要按照score排序,希望能重复用这个算法,应该怎么办呢?

function sortBy(field) {
  return function(a,b) {
    return a[field] - b[field];
  }
}
arr1.sort(sortBy("score"));

 

没错,核心的代码就这么简单了,一些可能抛出错误的判断,自己去考虑吧。在这种想法下面,我们还可以做一个设想:假如score相等的情况下,我们是否可以按照年龄的大小排序输出?

function sortBy(field1, field2) {
  return function(a, b) {
    if(a[field1] === b[field1]) return a[field2] - b[field2];
    return a.field1 - b.field1;
  }
}
arr1.sort(sortBy("score", "age"));

 

没错,其实也就这么简单,你甚至可以使用argments来获取更多的参数,用以传入更多的字段作为判断条件。

 

 

JavaScript ES6实现一个对象数组按照另一个对象数组进行排序

JavaScript ES6实现一个对象数组按照另一个对象数组进行排序

借助此篇博客,实现了需要的功能,特此记录一下:https://www.cnblogs.com/guojbing/p/10872867.html

假设有一个对象数组:

const arr1 = [
    {buyerId: "1", name: "WW"},
    {buyerId: "2", name: "RR"},
    {buyerId: "3", name: "OO"},
    {buyerId: "4", name: "ll"},
    {buyerId: "5", name: "DD"},
    {buyerId: "6", name: "SS"}
]

另一对象数组为:

const arr2 = [
    {buyerId: "4", totalPrice: "7.00"},
    {buyerId: "3", totalPrice: "90.00"},
    {buyerId: "2", totalPrice: "10.00"},
    {buyerId: "6", totalPrice: "70.00"},
    {buyerId: "1", totalPrice: "9.00"},
    {buyerId: "5", totalPrice: "60.00"}
]

现在希望arr2按照arr的buyerId属性排序,并显示其价格。应该怎么做呢?
首先,提取出arr1中的buyerId到一个新的数组:

let curArr = [];
arr1.find(item => {
    curArr.push(item.buyerId)
});

这样就获取到了数组:
控制台打印结果

接着,让arr2按照curArr的数据排放顺序排列:

let newArr = [];
arr2.sort((a, b) => {
    const prev = curArr.indexOf(a.buyerId);
    const next = curArr.indexOf(b.buyerId);
    return prev-next;
});
arr2.forEach(item => {
    newArr.push(item)
})

得到的结果为:
打印结果

这样就得到了按照要求排列的新数组,如果要只显示价格,就把newArr数组中的totalPrice提取到新的数组中,即可显示。

以上,就是我想要分享给大家的,还有另一种简单点的,对象数组根据数组进行比较的排序方式,具体的请看文章开始贴出的博客地址。

javascript – 使用另一个对象数组过滤对象数组

javascript – 使用另一个对象数组过滤对象数组

这个问题类似于这一个 Jquery filter array of object with loop,但这次我需要使用一组对象进行过滤.

例:

我有一个这样的对象数组:

myArray = [
{
    userid: "100",projectid: "10",rowid: "0"
},{
    userid: "101",projectid: "11",rowid: "1"},{    
    userid: "102",projectid: "12",rowid: "2"},{    
    userid: "103",projectid: "13",rowid: "3"
},{    
    userid: "101",rowid: "4"
}
...]

我想用这样的数组过滤它:

myFilter = [
{
    userid: "101",projectid: "11"
},{
    userid: "102",projectid: "12"
},{
    userid: "103",projectid: "11"
}]

并返回此(myFilter中的userid和projectid需要匹配myArray中的userid和projectid):

myArrayFiltered = [
{
    userid: "101",rowid: "1"
},rowid: "2"
}]

我怎样才能做到这一点 ?

解决方法

var filtered = [];

for(var arr in myArray){
   for(var filter in myFilter){
       if(myArray[arr].userid == myFilter[filter].userid && myArray[arr].projectid == myFilter[filter].projectid){
          filtered.push(myArray[arr].userid);
         }
   }
}
console.log(filtered);

javascript – 如何将一个对象数组拆分成多个普通数组,其中每个数组都由一个属性的值填充?

javascript – 如何将一个对象数组拆分成多个普通数组,其中每个数组都由一个属性的值填充?

我有一个对象数组如下:

var GOM = [{name:"Kuroko",ability:"misdirection"},{name:"Kise",ability:"perfect copy"},{name: "Akashi",ability: "emperor's eye"}];

是否可以使用lodash中的某些预定义函数或本机javascript(不是forEach)将其拆分为2个数组.

["Kuroko","Kise","Akashi"] and ["misdirection","perfect copy","emperor's eye"]

我知道我可以这样做:

var names = [];
var abilities = [];
GOM.forEach(function(member){
  names.push(member.name);
  abilities.push(member.ability);
});

但我正在寻找另一种方式.

解决方法

看起来没有什么比Lodash的两个更短的了:

var data = [
  {name:"Kuroko",ability: "emperor's eye"}
];

var names = _.pluck(data,'name');
var abilities = _.pluck(data,'ability');

alert(JSON.stringify(names,null,4));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.0/lodash.js"></script>

javascript – 如何根据另一个数组的顺序对对象数组进行排序?

javascript – 如何根据另一个数组的顺序对对象数组进行排序?

我有一个对象列表:
[ { id: 4,name:'alex' },{ id: 3,name:'jess' },{ id: 9,name:'...' },{ id: 1,name:'abc' } ]

我有另一个名单与正确的“命令”.

[ 3,1,9,4]

根据密钥“id”,如何将第一个列表与第二个列表的排序相匹配?
结果应该是:

[ { id: 3,name:'abc' },{ id: 4,name:'alex' } ]

解决方法

我踩了这个问题,用简单的.sort解决了这个问题

假设要排序的列表存储在变量needSort中,并且具有顺序的列表是变量顺序,并且两者都在相同的范围内,您可以像这样运行.sort:

needSort.sort(function(a,b){
  return order.indexOf(a.id) < order.indexOf(b.id) ? -1 : 1;
});

它为我工作,希望它有帮助.

今天的关于sort方法实际应用详解---javascript中对一个对象数组按照对象某个属性进行排序的分享已经结束,谢谢您的关注,如果想了解更多关于JavaScript ES6实现一个对象数组按照另一个对象数组进行排序、javascript – 使用另一个对象数组过滤对象数组、javascript – 如何将一个对象数组拆分成多个普通数组,其中每个数组都由一个属性的值填充?、javascript – 如何根据另一个数组的顺序对对象数组进行排序?的相关知识,请在本站进行查询。

本文标签: