如果您想了解sort方法实际应用详解---javascript中对一个对象数组按照对象某个属性进行排序的知识,那么本篇文章将是您的不二之选。同时我们将深入剖析JavaScriptES6实现一个对象数组
如果您想了解sort方法实际应用详解---javascript中对一个对象数组按照对象某个属性进行排序的知识,那么本篇文章将是您的不二之选。同时我们将深入剖析JavaScript ES6实现一个对象数组按照另一个对象数组进行排序、javascript – 使用另一个对象数组过滤对象数组、javascript – 如何将一个对象数组拆分成多个普通数组,其中每个数组都由一个属性的值填充?、javascript – 如何根据另一个数组的顺序对对象数组进行排序?的各个方面,并给出实际的案例分析,希望能帮助到您!
本文目录一览:- sort方法实际应用详解---javascript中对一个对象数组按照对象某个属性进行排序
- JavaScript ES6实现一个对象数组按照另一个对象数组进行排序
- javascript – 使用另一个对象数组过滤对象数组
- javascript – 如何将一个对象数组拆分成多个普通数组,其中每个数组都由一个属性的值填充?
- 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方法有两个注意点:
- 会操作原始数组,经过操作后原始数组发生变化
- 默认排序按照字符编码排序,例如,我们有下面的一个例子:
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实现一个对象数组按照另一个对象数组进行排序
借助此篇博客,实现了需要的功能,特此记录一下: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 – 使用另一个对象数组过滤对象数组
例:
我有一个这样的对象数组:
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 – 如何将一个对象数组拆分成多个普通数组,其中每个数组都由一个属性的值填充?
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); });
但我正在寻找另一种方式.
解决方法
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 – 如何根据另一个数组的顺序对对象数组进行排序?
[ { 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' } ]
解决方法
假设要排序的列表存储在变量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 – 如何根据另一个数组的顺序对对象数组进行排序?的相关知识,请在本站进行查询。
本文标签: