一个数组中添加对象有多个对象,每个对象中又有数组

Posts - 29,
Articles - 0,
Comments - 58
19:15 by 那时候的我, ... 阅读,
一、普通数组排序  
  js中用方法sort()为数组排序。sort()方法有一个可选参数,是用来确定元素顺序的函数。如果这个参数被省略,那么数组中的元素将按照ASCII字符顺序进行排序。如:
var arr = ["a", "b", "A", "B"];
arr.sort();
console.log(arr);//["A", "B", "a", "b"]
因为字母A、B的ASCII值分别为65、66,而a、b的值分别为97、98,所以上面输出的结果是&["A", "B", "a", "b"] 。
  如果数组元素是数字呢,结果会是怎样?
var arr = [15, 8, 25, 3];
arr.sort();
console.log(arr);//[15, 25, 3, 8]
结果是&[15, 25, 3, 8] 。其实,sort方法会调用每个数组项的toString()方法,得到字符串,然后再对得到的字符串进行排序。虽然数值15比3大,但在进行字符串比较时"15"则排在"3"前面。显然,这种结果不是我们想要的,这时,sort()方法的参数就起到了作用,我们把这个参数叫做比较函数。
  比较函数接收两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等则返回0,如果第一个参数应该位于第二个之后则返回一个正数。例子:
var arr = [23, 9, 4, 78, 3];
var compare = function (x, y) {//比较函数
if (x & y) {
return -1;
} else if (x & y) {
console.log(arr.sort(compare));
结果为&[3, 4, 9, 23, 78] ,返回了我们想要的结果。如果要按降序排序,比较函数写成这样即可:
var compare = function (x, y) {
if (x & y) {
} else if (x & y) {
return -1;
  我们并不能用比较函数比较一个不能转化为数字的字符串与数字的顺序:
var arr = ["b", 5];
console.log(arr.sort(compare))
结果是&["b", 5] 。因为比较函数在比较时,会把先把字符串转化为数字,然后再比较,字符串b不能转化为数字,所以就不能比较大小。然而,当不用比较函数时,会比较ASCII值,所以结果是&[5, "b"] 。
二、数组对象排序
  如果数组项是对象,我们需要根据数组项的某个属性对数组进行排序,要怎么办呢?其实和前面的比较函数也差不多:
var arr = [{name: "zlw", age: 24}, {name: "wlz", age: 25}];
var compare = function (obj1, obj2) {
var val1 = obj1.
var val2 = obj2.
if (val1 & val2) {
return -1;
} else if (val1 & val2) {
console.log(arr.sort(compare));
  输出结果为&[Object { name="wlz", age=25}, Object { name="zlw", age=24}] ,可以看到数组已经按照&name 属性进行了排序。我们可以对上面的比较函数再改造一下:
var compare = function (prop) {
return function (obj1, obj2) {
var val1 = obj1[prop];
var val2 = obj2[prop];if (val1 & val2) {
return -1;
} else if (val1 & val2) {
如果想按照&age 进行排序, arr.sort(compare("age")) 即可。
  但是对age属性进行排序时需要注意了,如果age属性的值是数字,那么排序结果会是我们想要的。但很多时候我们从服务器传回来的数据中,属性值通常是字符串。现在我把上面的数组改为:
var arr = [{name: "zlw", age: "24"}, {name: "wlz", age: "5"}];
可以看到,我把&age&属性由数字改为了字符串,第二个数组项的&age&值改为了&"5"&。再次调用&arr.sort(compare("age")) 后,结果为:
[Object { name="zlw", age="24"}, Object { name="wlz", age="5"}]
我们的期望是5排在25前面,但是结果不是。这是因为当两个数字字符串比较大小时,会比较它们的ASCII值大小,比较规则是:从第一个字符开始,顺次向后直到出现不同的字符为止,然后以第一个不同的字符的ASCII值确定大小。所以"24"与"5"比较大小时,先比较&2&与"5"的ASCII值,显然&2&的ASCII值比"5"小,即确定排序顺序。
  现在,我们需要对比较函数再做一些修改:
var compare = function (prop) {
return function (obj1, obj2) {
var val1 = obj1[prop];
var val2 = obj2[prop];
if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
val1 = Number(val1);
val2 = Number(val2);
if (val1 & val2) {
return -1;
} else if (val1 & val2) {
在比较函数中,先把比较属性值转化为数字&Number(val1) 再通过&!isNaN(Number(val1))&判断转化后的值是不是数字(有可能是NaN),转化后的值如果是数字,则比较转换后的值,这样就可以得到我们想要的结果了, 调用& arr.sort(compare("age")) 得到:
[Object { name="wlz", age="5"}, Object { name="zlw", age="24"}]
可以看到,确实是按正确的方式排序了。
&  这篇文章所讲的都是基础的,没什么技术含量,只是最近项目中遇到了对数组对象进行排序的问题,所以在这里写出来分享一下,相信总能帮到一些朋友。匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。java对象数组的概述和使用 - 技术丶交流 - 博客园
1 public class Student
15.02 对象数组的内存图解
15.03 集合的由来及与数组的区别
集合类的由来:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。
数组和集合类同的区别:
数组可以存储同一种类型的基本数据也可以存储同一种类型的对象,但长度是固定的
集合只可以存储不同类型的对象,长度是可变的
集合类的特点:集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
15.04 集合的继承体系图解
集合容器因为内部的数据结构不同,有多种具体容器,根据共性内容不断的向上抽取,就形成了集合框架。
框架的顶层Collection接口
15.05 Collection集合的功能概述
Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。
15.06 Collection集合的基本功能测试
1.& boolean add(Ee):确保此 collection 包含指定的元素(可选操作)。
2.& boolean remove(Objecto):从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
3.& void clear():移除此 collection 中的所有元素(可选操作)。
4.& boolean contains(Objecto):如果此 collection 包含指定的元素,则返回 true。
5.& boolean isEmpty():如果此 collection 不包含元素,则返回 true。
6.& int size():返回此 collection 中的元素数。
15.07 Collection集合的高级功能测试
1.& boolean addAll(Collection&? extends E& c):
将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。
2.& boolean removeAll(Collection&?& c):
移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
3.& boolean containsAll(Collection&?& c):
如果此 collection 包含指定 collection 中的所有元素,则返回 true。
4.& boolean retainAll(Collection&?& c):
仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。换句话说,移除此 collection 中未包含在指定 collection 中的所有元素。
15.08 集合的遍历之集合转数组遍历
Object[] toArray():返回包含此 collection 中所有元素的数组。
1 public class Practice
public static void main(String[] args)
15.09 Collection存储自定义对象并遍历案例(使用数组)
1 public class Practice
public static void main(String[] args)
15.10 集合的遍历之迭代器遍历
Iterator&E& iterator():返回在此 collection 的元素上进行迭代的迭代器。
15.11 Collection存储自定义对象并遍历案例(使用迭代器)
1 public class Practice
public static void main(String[] args)
15.12 迭代器使用的问题探讨
1.使用迭代器获取元素的两种方式:
Iterator it = c.iterator();
while(it.hasNext())
Student s = (Student)it.next();
System.out.println(s.getName()+":"+s.getAge());
for(Iterator it = c.iterator()
使用方式2的好处:it在for循环结束后就变成垃圾,效率较高
2.不要多次使用it.next()方法
Iterator it = c.iterator();
while(it.hasNext())
System.out.println(((Student)it.next()).getName());
System.out.println(((Student)it.next()).getAge());
上面的代码表示获取的是第1个学生的姓名,第2个学生的年龄,以此类推,如果集合中的元素是奇数个,则会报NoSuchElementException错误
15.13 集合的使用步骤图解
集合的使用步骤:
1.& 创建集合对象
2.& 创建元素对象
3.& 将元素添加到集合
4.& 遍历集合
4.1 通过集合对象获取迭代器对象
4.2 通过迭代器对象的hasNext()方法判断是否有元素
4.3 通过迭代器对象的Next()方法获取元素并移动到下一个位置
15.14 迭代器的原理及源码解析
假设迭代器定义的是一个类,那么就可以创建该类的对象,调用该类的方法来实现集合的遍历,但是Java中提供了很多的集合类,而这些集合类的数据结构是不同的,所以存储的方式和遍历的方式也应该是不同的,进而它们的遍历方式也应该是不一样的。最终就没有定义迭代器类
而无论使用哪种集合都应该具备获取元素的操作,并且最好再辅助与判断功能,也就是说判断功能和获取功能应该是一个集合遍历所具备的,而每种集合的方式又不太一样,所以将这两个功能给提取出来,并不提供具体实现,这种方式就是接口,而真正具体的实现类在具体的子类中以内部类的方式体现的
public interface Iterator
boolean hasNext();
Object next();
public interface Iterable
Iterator iterator();
public interface Collection extends Iterable
Iterator iterator();
public interface List extends Collection
Iterator iterator();
public class ArrayList implements List
public Iterator iterator()
return new Itr();
15.15 Collection存储字符串并遍历
1 import java.util.ArrayL
2 import java.util.C
3 import java.util.I
5 public class Practice
public static void main(String[] args)
15.16 Collection存储学生对象并遍历
1 import java.util.ArrayL
2 import java.util.C
3 import java.util.I
5 public class Practice
public static void main(String[] args)
15.17 List存储字符串并遍历
1 public class Practice
public static void main(String[] args)
15.18 List集合的特点
List接口概述:有序的(存取顺序一致)collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
特点:与 set 不同,列表通常允许重复的元素。
15.19 List存储学生对象并遍历
1 public class Practice
public static void main(String[] args)
15.20 List集合的特有功能概述和测试
1.& void add(int index,Eelement):
在列表的指定位置插入指定元素(可选操作)。
2.& Eremove(int index):
移除列表中指定位置的元素(可选操作)。
3.& Eget(int index):
返回列表中指定位置的元素。
4.& Eset(int index, Eelement):
用指定元素替换列表中指定位置的元素(可选操作)。
list.add(2,"javaee");//在2的位置插入javaee,改变集合长度
list.get(2)//返回集合中2位置上的元素,不改变集合长度
list.remove(1)//删除集合中1位置上的元素,返回被删除的元素,改变集合长度
list.set(2, "javaee")//将集合中2位置上的元素替换为javaee,返回被替换的元素,不改变集合长度
15.21 List集合的特有遍历功能
1 for (int i = 0
15.22 List存储自定义对象并遍历(使用List特有功能遍历)
1 public class Practice
public static void main(String[] args)
15.23 ListIterator的特有功能
ListIterator&E& listIterator():
返回此列表元素的列表迭代器(按适当顺序)。
注意:ListIterator可以实现逆向遍历,但是必须先正向遍历,才能逆向遍历
1 public class Practice
public static void main(String[] args)
15.24 并发修改异常的产生原因及解决方案
1 public class Practice
public static void main(String[] args)
上面的代码会运行错误,发生ConcurrentModificationException异常
错误产生原因:迭代器是依赖于集合存在的,在迭代的过程中使用集合的方法添加元素迭代器是不知道的,所以报错,并发修改异常
解决方案:1.用迭代器迭代元素时使用迭代器修改元素(ListIterator列表迭代器),添加的元素在迭代的元素后面
2.用集合遍历元素,用集合修改元素(for循环),添加的元素在最后
15.25 数据结构之栈和队列
数据结构:数据的组织方式
15.26 数据结构之数组和链表
数组:存储同一种类型的多个元素的容器
链表:由一个链子把多个节点(数据和节点)连起来组成的数据
15.27 List的三个子类的特点
ArrayList:底层数据结构是数组,查询快,增删慢,是不同步的,线程不安全,效率高
Vector:底层数据结构是数组,查询快,增删慢,是同步的,线程安全,效率低
LinkedList:底层数据结构是链表,查询慢,增删快,是不同步的,线程不安全,效率高}

我要回帖

更多关于 vue删除数组中的对象 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信