精华内容
下载资源
问答
  • JavaScript 数组对象sort()方法排序详解 一、sort()方法原理 JS中提供了一个sort()方法来对数组排序,如果直接使用sort()方法,该方法将按照ASCII的顺序对数组元素进行排序

    JavaScript 数组对象sort()方法排序详解

    一、sort()方法基本原理

    如果直接使用sort()方法,该方法将按照ASCII码的从小到大顺序对数组元素进行排序,例:

    var arr = ["b","a","B","A"];
    arr.sort();
    console.log(arr);
    

    该代码运行结果将为:

    ["A","B","a","b"]
    

    但是当我们对数字进行排序时,会出现问题,例:

    var arr = [5,16,24,7,3];
    arr.sort();
    console.log(arr);
    

    而此时得到输出结果为:

    [1624357]
    

    会得到这种结果,是因为sort()方法事实上有一个可选参数,参数类型为一个函数,该函数用来确定数组元素的排序顺序,即 compareFunction 。当我们没有指定参数时,该方法是将数组元素首先通过toString()转化为字符串,再通过ASCII码进行排序,转化成ASCII码的16和24比3要大,因此会排在前面。
    因此我们需要一个比较函数来对数组元素排序。

    二、比较函数

    sort()方法如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:

    • 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;
    • 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);
    • 如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。
    • compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

    因此比较函数的格式要求如下:

    function compare(a, b) {
      if (a < b ) {           
      // 按某种排序标准进行比较, a 小于 b
        return -1;
      }
      if (a > b ) {
        return 1;
      }
      // a与b相等
      return 0;
    }
    

    数字数组的比较函数

    从小到大:

    function compareNumbers(a, b) {
      return a - b;
    }
    

    从大到小:

    function compareNumbers(a, b) {
      return b - a;
    }
    

    当然,我们也可以直接在使用比较函数时定义该方法

    var numbers = [4, 8, 2, 1, 3];
    numbers.sort(function(a, b) {
      return a - b;
    });
    console.log(numbers);
    

    也可以通过某种属性比较

    此处借用MDN上的例子

    var items = [
      { name: 'Edward', value: 21 },
      { name: 'Sharpe', value: 37 },
      { name: 'And', value: 45 },
      { name: 'The', value: -12 },
      { name: 'Magnetic' },
      { name: 'Zeros', value: 37 }
    ];
    
    // sort by value
    items.sort(function (a, b) {
      return (a.value - b.value)
    });
    
    // sort by name
    items.sort(function(a, b) {
      var nameA = a.name.toUpperCase(); // ignore upper and lowercase
      var nameB = b.name.toUpperCase(); // ignore upper and lowercase
      if (nameA < nameB) {
        return -1;
      }
      if (nameA > nameB) {
        return 1;
      }
    
      // names must be equal
      return 0;
    });
    
    展开全文
  • 应用场景:显示服务列表...原理: true - false //-1 true = true //0 false = false //0 false = true //1 代码实现: array = [ { name: 'service1', isFree: true }, { name: 'service2', isFree: false }, ...

    应用场景:显示服务列表时,优先显示付费服务;

    原理:

    true - false  //-1
    true = true   //0
    false = false //0
    false = true  //1
    

    代码实现:

    array = [
        { name: 'service1', isFree: true },
        { name: 'service2', isFree: false },
        { name: 'service3', isFree: true },
        { name: 'service4', isFree: false }
    ]
    
    array.sort((a, b) => a.isFree - b.isFree)
    
    //打印结果:
    [
        { name: "service2", isFree: false },
        { name: "service4", isFree: false },
        { name: "service1", isFree: true },
        { name: "service3", isFree: true }
    ]
    
    展开全文
  • 一、对数组进行排序:sort() 我们知道,在js中,我们可以采用sort()方法对数组进行排序,但是它并不是万能的,下面就具体剖析下: 1、sort()方法说明 该方法以字母顺序对数组进行排序,如下: let fruits = [...

    一、对数组进行排序:sort()

    我们知道,在js中,我们可以采用sort()方法对数组进行排序,但是它并不是万能的,下面就具体剖析下:

    1、sort()方法说明

    该方法以字母顺序对数组进行排序,如下:

    let fruits = ["Banana", "Orange", "Bpple", "Mango"];
    fruits.sort();
    fruits // ["Apple", "Banana", "Mango", "Orange"]

    2、说明:

    sort()是从小到大排序,果我们想要从大到小的顺序排列该如何解决呢?利用reverse()来解决!具体实现步骤如下:

    1>、先采用sort()进行排序;

    2>、然后采用reverse()方法将排好序的数组进行反转。

    reverse():反转数组

    具体代码实现如下:

    fruits.sort(); // 对 fruits 中的元素进行排序
    fruits.reverse();
    fruits // ["Orange", "Mango", "Banana", "Apple"]

    上面是对字符串进行排序,那么如果数组数据成员的类型是Number(即数值型)会出现怎样的结果呢?看下面的

    一个示例:

    let arr3 = [240, 25, 10, 300, 310];
    // 排序
    arr3.sort();
    arr3 // [10, 240, 25, 300, 310]

    从结果得知,并不是我们想象中的结果。为什么会这样呢?

    因为sort()是对字符串进行排序。但是如果数组元素为数字Number类型,会出错,因为它与字符串比较大小的规则不一样。字符

    串排序(比较大小)的规则:   

    字符串按字符在unicode中的码位(ascall码值)来比较大小。从第一个依次对应往后比,直到找到不相同的字符,然后拿出

    其 ascall码值比较以此来决胜~

    下面以具体的示例(arr3)来说明具体演示下:

    如果数字按照字符串来排序,则 "25" 大于 "240", 因为 "5" 大于 "4"。所以,sort() 方法在对数值排序时会产生不正确的结果。

    我们通过一个比值函数来修正此问题:

    arr3.sort(function(a, b) {
    	return a - b
    });
    // 此时  
    arr3 // [10, 25, 240, 300, 310]
    
    // 想要降序排序,可以这样改:
    arr3.sort(function(a, b) {
    		return b - a
    });
    arr3 // [310, 300, 240, 25, 10]

    比值函数原理分析:

    比较函数的目的是定义另一种排序顺序。

    比较函数应该返回一个负, 零或正值, 这取决于参数a与b的大小。

    function(a, b) {
    	return a - b
    }

    当 sort() 函数比较两个值时,会将值发送到比较函数,并根据所返回的值(负、零或正值)对这些值进行排序。举例说明:

    arr3数组中的,240与25

    当比较 240 和 25 时,sort() 方法会调用比较函数 function(240,25)。该函数计算 240-25,然后返回 215(正值)排序函数将把

    240 排序为比 25 更高的值。

     

    二、以随机顺序排序数组

    在实际项目中,假设有一个列表展示,每次进页面需要展示不同的数据-->即进行数据刷新(达到更新的目的),利用随机数组排序

    能达到需求.不过这个实时刷新一般由后端实现,无须前端去关心。

    arr3.sort(function(a, b) {
    	return 0.5 - Math.random()
    		});
    arr3
    


               

     

    三、查找数组中的最值

    JavaScript 不提供查找数组中最大或最小数组值的内建函数。不过, 在对数组进行排序之后,能够使用索引来获得最高或最低

    值。 如果仅仅需要找到最高或最低值,对整个数组进行排序是效率极低的方法。 

    改进的方法:Math.max() / Math.min()求最值

    可以使用 Math.max.apply 来查找数组中的最高值:

    // 可以使用 Math.max.apply 来查找数组中的最高值:
    function myArrayMax(arr) {
    		return Math.max.apply(null, arr);
    }
    
    // 可以使用 Math.min.apply 来查找数组中的最低值:
    function myArrayMax(arr) {
    		return Math.min.apply(null, arr);
    }
    
    
    			 

    Math.max 参数里面不支持Math.max([param1,param2,...]) 也就是数组。但是它支持Math.max(param1,param2,…)。所以的话,

    利用apply()方法与es6中的数组扩展符(...)来解决Math.max/Math.min参数的问题。

    apply():除了改变this的指向,它还有个巧妙的用处,可以将一个数组默认的转换为一个参数列表:([param1,param2,param3] 转

    换为 param1,param2,param3) 。

    es6扩展具体看这里:https://blog.csdn.net/Syleapn/article/details/98510550

    所以的话:Math.max(1,2,3) <=> Math.max.apply(null,[1,2,3]) 

                                                   <=> Math.max(...[1,2,3])

     

     这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法,我只需要用这个方法帮我运算,得到返回的结

    果就行,.所以直接传递了一个null过去。

     

    四、对象数组进行排序

    //JavaScript 数组经常会包含对象:
    let object_array = [{
    		name: "kali",
    		age: 28
    	},
    	{
    		name: "Sida",
    		age: 12
    	},
    	{
    		name: "weilian",
    		age: 100
    	}
    ]

    即使对象拥有不同数据类型的属性,sort() 方法仍可用于对对象数组进行排序。

     解决方法是通过比较函数来对比属性值:

    // 比较数值属性
    			object_array.sort(function(a, b) {
    				return a.age - b.age
    			});
    			object_array
    			console.log(object_array)
    
    			// 比较字符串属性
    			object_array.sort(function(a, b) {
    				// 先要全部转换为大写或小写字母,由于用到了字符的ASCII
    				// 不转换就会有问题导致~
    				// 转化为小写字母
    				var x = a.name.toLowerCase();
    				var y = b.name.toLowerCase();
    				// 或转化为大写字母
    				// var x = a.name.toUpperCase();
    				// var y = b.name.toUpperCase();
    				// 
    				if (x < y) {
    					return -1;
    				}
    				if (x > y) {
    					return 1;
    				}
    				return 0;
    			});

     

    展开全文
  • #1楼 参考:https://stackoom.com/question/1dFJy/Swift如何按属性值对自定义对象数组进行排序 #2楼 [ Updated for Swift 3 with sort(by:) ] This, exploiting a trailing closure: [ 更新了Swift 3的sort(by :) ...

    本文翻译自:Swift how to sort array of custom objects by property value

    lets say we have a custom class named imageFile and this class contains two properties. 可以说我们有一个名为imageFile的自定义类,该类包含两个属性。

    class imageFile  {
        var fileName = String()
        var fileID = Int()
    }
    

    lots of them stored in Array 其中很多存储在数组中

    var images : Array = []
    
    var aImage = imageFile()
    aImage.fileName = "image1.png"
    aImage.fileID = 101
    images.append(aImage)
    
    aImage = imageFile()
    aImage.fileName = "image1.png"
    aImage.fileID = 202
    images.append(aImage)
    

    question is: how can i sort images array by 'fileID' ASC or DESC? 问题是:如何按“ fileID” ASC或DESC对图像数组进行排序?


    #1楼

    参考:https://stackoom.com/question/1dFJy/Swift如何按属性值对自定义对象数组进行排序


    #2楼

    [ Updated for Swift 3 with sort(by:) ] This, exploiting a trailing closure: [ 更新了Swift 3的sort(by :) ],利用了尾随的闭包:

    images.sorted { $0.fileID < $1.fileID }
    

    where you use < or > depending on ASC or DESC, respectively. 在何处分别使用<>取决于ASC或DESC。 If you want to modify the images array , then use the following: 如果要修改images数组 ,请使用以下命令:

    images.sort { $0.fileID < $1.fileID }
    

    If you are going to do this repeatedly and prefer to define a function, one way is: 如果要重复执行此操作,并且希望定义一个函数,则一种方法是:

    func sorterForFileIDASC(this:imageFile, that:imageFile) -> Bool {
      return this.fileID > that.fileID
    }
    

    and then use as: 然后用作:

    images.sort(by: sorterForFileIDASC)
    

    #3楼

    First, declare your Array as a typed array so that you can call methods when you iterate: 首先,将Array声明为类型化数组,以便在迭代时可以调用方法:

    var images : [imageFile] = []
    

    Then you can simply do: 然后,您可以简单地执行以下操作:

    Swift 2 迅捷2

    images.sorted({ $0.fileID > $1.fileID })
    

    Swift 3 & Swift 4 & Swift 5 雨燕3&雨燕4&雨燕5

    images.sorted(by: { $0.fileID > $1.fileID })
    

    The example above gives desc sort order 上面的示例给出了desc排序顺序


    #4楼

    You can also do something like 您也可以做类似的事情

    images = sorted(images) {$0.fileID > $1.fileID}
    

    so your images array will be stored as sorted 因此您的图片数组将按排序存储


    #5楼

    If you are going to be sorting this array in more than one place, it may make sense to make your array type Comparable. 如果要在一个以上的地方对该数组进行排序,则使数组类型为Comparable可能有意义。

    class MyImageType: Comparable, Printable {
        var fileID: Int
    
        // For Printable
        var description: String {
            get {
                return "ID: \(fileID)"
            }
        }
    
        init(fileID: Int) {
            self.fileID = fileID
        }
    }
    
    // For Comparable
    func <(left: MyImageType, right: MyImageType) -> Bool {
        return left.fileID < right.fileID
    }
    
    // For Comparable
    func ==(left: MyImageType, right: MyImageType) -> Bool {
        return left.fileID == right.fileID
    }
    
    let one = MyImageType(fileID: 1)
    let two = MyImageType(fileID: 2)
    let twoA = MyImageType(fileID: 2)
    let three = MyImageType(fileID: 3)
    
    let a1 = [one, three, two]
    
    // return a sorted array
    println(sorted(a1)) // "[ID: 1, ID: 2, ID: 3]"
    
    var a2 = [two, one, twoA, three]
    
    // sort the array 'in place'
    sort(&a2)
    println(a2) // "[ID: 1, ID: 2, ID: 2, ID: 3]"
    

    #6楼

    Nearly everyone gives how directly, let me show the evolvement: 几乎每个人都给出直接的方式,让我展示一下演变过程:

    you can use the instance methods of Array: 您可以使用Array的实例方法:

    // general form of closure
    images.sortInPlace({ (image1: imageFile, image2: imageFile) -> Bool in return image1.fileID > image2.fileID })
    
    // types of closure's parameters and return value can be inferred by Swift, so they are omitted along with the return arrow (->)
    images.sortInPlace({ image1, image2 in return image1.fileID > image2.fileID })
    
    // Single-expression closures can implicitly return the result of their single expression by omitting the "return" keyword
    images.sortInPlace({ image1, image2 in image1.fileID > image2.fileID })
    
    // closure's argument list along with "in" keyword can be omitted, $0, $1, $2, and so on are used to refer the closure's first, second, third arguments and so on
    images.sortInPlace({ $0.fileID > $1.fileID })
    
    // the simplification of the closure is the same
    images = images.sort({ (image1: imageFile, image2: imageFile) -> Bool in return image1.fileID > image2.fileID })
    images = images.sort({ image1, image2 in return image1.fileID > image2.fileID })
    images = images.sort({ image1, image2 in image1.fileID > image2.fileID })
    images = images.sort({ $0.fileID > $1.fileID })
    

    For elaborate explanation about the working principle of sort, see The Sorted Function . 有关sort的工作原理的详细说明,请参见Sorted Function

    展开全文
  • 常用的排序算法有 ... 对一个数组a来说,选择排序先找到数组最小的项,将它与a[0]交换。然后,忽略a[0],找到下一个最小的项并交换到 a[1],以此类推。图1-1显示了如何利用选择排序通过交换值完成对...
  • 数组--选择排序原理

    2019-09-18 22:45:10
    1 原理 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。 2 选择排序图解 3 代码详解 public static void main...
  • 最近遇到了一道多条件排序题,类似于“something有A,B,C三个属性,先比较A,A条件相同时再比较B,B条件相同时再比较C,排序输出”的形式。这类题目用C/C++解决起来会很顺手,可以用结构体,结合sort和compare,就能...
  • 首先,我们要进行冒泡排序,我们需要一个排序对象,这里我们以int类型数组为例,这里先声明一个int类型数组,声明一个数组有两种方式,一种是动态初始化,一种是静态初始化,我们要对数组内的元素进行排序,所以...
  • 数组的扁平化,去重,排序数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组 var arr = [ [1, 2, 2], [3, 4, 5, 5, '5' ], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]; 1.es6解法 优点:...
  • 数组对象 数组:是一个可以存储大量数据的容器。数组中可以存放任意的数据类型的数据 1.声明方式: 字面量形式声明 [] 通过构造函数来声明 new Array(10,20,100,300) 定义数组同时即初始化 new Array(2); //定义一...
  • 声明并开辟数组: 数据类型 数组名称[] = new 数据类型 [长度]; 分布完成: 数据类型 数组名称[] = null; 数组名称 = new 数据类型 [长度]; 以上可以看出定义格式 和 实例化对象的思路基本一致,eg: int...
  • js引用类型--数组

    2017-08-10 21:42:33
    数组是值的有序集合,而且可以存放js各种数据类型,因为js是弱类型的语言,所以不像其他语言数组只能存放特定的数据类型 注意:1. ECMAScript语言中的数组是可以动态变化的(因为是js的数组的数值存储采用链式结构...
  • Array 数组对象

    2019-07-25 02:02:20
    Array 数组对象 1、什么是数组 数组就是一组数据的集合 其表现形式就是内存中的一段连续的内存地址 数组名称其实就是连续内存地址的首地址 2、js中的数组特点 数组定义时无需指定数据类型 数组定义时可以无需指定...
  • 数组对象创建数组数组可以存储任意数据类型的数据存储方式分为字面量方式存储、构造函数方式存储数据类型:5基1复5基本:number、string、boolean、null、undefined1复杂:object、function,arrayvar now = new ...
  • 数组、函数和对象
  • J2SE——Date类型数组排序

    热门讨论 2018-02-27 14:51:19
    【前言】 上篇博客介绍了main方法中的args数组,为了体现args数组的作用及其应用,还举了一个用冒泡排序和选择排序对int类型的数组进行... Date类型数组排序和int类型数组排序其实差不多,原理都相同,只不过...
  • 数组方法、冒泡排序、选择排序数组声明数组数组下标遍历数组1、for循环遍历数组2、for..in循环遍历数组3、for...of循环遍历区别数组方法push(...数组排序**比较函数可以返回任何数字****箭头函数最好**冒泡排序选择排序...
  • 7、详述 MySQL 主从复制原理及配置主从的完整步骤。 8、MySQL 如何实现双向互为主从复制,并说明应用场景? 9、MySQL 如何实现级联同步,并说明应用场景? 10、MySQL 主从复制故障如何解决? 02 二战阿里,天猫团队...
  • 1、数组是多个相同类型数据的组合,实现对这些数据的统一管理 2、数组中的元素可以是任何数据类型,包括基本类型和引用类型 3、数组属引用类型数组型数据是对象(object),数组中的每个元素相当于该对象的成员变量
  • Java对象数组排序

    千次阅读 2013-06-15 19:35:12
    数组排序:  1, 数组的元素 是 基本类型, 直接使用 Arrays.sort(arr) 即可 ;   2, 数组的元素 是 引用类型, 则需要让元素 具备可比性; 原理: 数组工具类Arrays 的 sort 方法, 比较元素的大小, 会调用...
  • 今天复习数组,觉得之前学的好些都忘得差不多了,所以好记性不如烂笔头,笔耕不断,慢慢积累自己的知识体系。 在讨论数组的扩容问题之前,我们先复习下数组...//使用对象的创建方式 int[] arr = new int[4]; arr.f...
  • 数组排序: 1.简单的sort排序: var arr=[1,5,3,87,23]; arr.sort(function(a,b){ return a-b; }) console.log(arr)//输出:[1,23,3,5,87] 注:若返回b-a可获得从大到小的排序; 数组的sort方法只能实...
  • 数组是指一组数据的集合,其中的每个数据被称作元素,在数组中可以存放任意类型的元素。 2.创建数组 JS 中创建数组有两种方式 (1) 利用 new 创建数组 var 数组名 = new Array() ; var arr = new Array(); ...
  • JavaScript中数组的sort()方法主要用于对数组的元素进行排序。一、原理:arr.sort((m, n) =&gt; { ... return (number); } sort内的函数返回值小于0, m排在n前面; 返回值等于 0, m,n相等顺序无关要紧; ...
  • Java面试题大全(2020版)

    万次阅读 多人点赞 2019-11-26 11:59:06
    getBytes():返回字符串的 byte 类型数组。 length():返回字符串长度。 toLowerCase():将字符串转成小写字母。 toUpperCase():将字符串转成大写字符。 substring():截取字符串。 equals():字符串比较。 11. ...
  • JS数组对象

    2020-12-27 13:03:38
    第1关:数组的创建、读写和长度 任务描述 本关任务:掌握创建数组的方法,获取数组的元素和长度。 相关知识 数组的出现就是为了批量处理数据。 数组的创建 创建数组有两种方法,一是使用数组字面量,简单来说就是在...
  • JavaScript对象克隆 浅拷贝 浅拷贝引用值是要相互影响的,因为它是栈内存之间的赋值,赋值的是地址,一个更改,其他的都要更改。 var obj = { name :'abc', age : 123, sex : 'female', card : ['visa','master'...
  • JavaScript 数组去重的多种方法原理详解

    千次阅读 多人点赞 2017-06-02 14:24:14
    说明数组去重,这是一个面试经常会遇见的问题,网上讲数组去重的文章也是特别的多,但是我们依旧来讲讲数组去重,这篇文章比较适合于接触过一段时间的JavaScript的初学者,希望这篇文章能给初学者带来一些帮助。...
  • javascript入门笔记

    2018-05-15 15:01:07
    条件是一个boolean类型的数据,如果条件结果为true,则执行表达式1的内容,并将表达式1的结果作为整体表达式的结果。如果条件为false,则执行表达式2的内容,并将表达式2的结果作为整体表达式的结果 ex: var age ...
  • 选择排序 假设数组为int[] a = { 49, 38, 65, 97, 76, 13, 27 },数组元素个数为7个。 第1轮比较:先是a[0]与a[1]比较,大于则先交换,再比较a[0]和a[2]…最后是a[0]与a[6]比较。总共比较6次。(此时a[0]已是数组中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 86,190
精华内容 34,476
关键字:

数组是对象类型数组排序原理