ES6新增的数组方法和对象方法

  • Post author:
  • Post category:其他


(ES6新增的数组方法和对象方法) 本节课,我们将会学习一些ES6新增的数组方法。

find();查找数组某个元素
findIndex();查找某个元素的索引值
some();数组中是否有元素符合条件
every();数组中是否所有的元素都符合条件
复制代码

以及对象方法

Object.assign(); 复制一个对象
Object.keys(); 得到一个对象的所有属性;
Object.values(); 得到一个对象的所有可枚举属性值;
Object.entries(); 得到一个对象的键值对数组;
Object.fromEntries(); entries的逆操作;
复制代码

新增的数组方法 find() 在开发当中,我们经常有一个需求就是去寻找数组中的某个元素。那么,使用我们之前学过的方法,无论使用哪一种。写下的代码都不会很少。而且,为了避免性能的浪费,我们应该在找到符合的元素之后,就结束这个循环。那么,就限制了我们只能使用for循环或者是for of去做这件事情。

var arr = [
    {
        name: "Tom",
        age: 18
    },
    {
        name: "Jerry",
        age: 19
    },
    {
        name: "Alex",
        age: 28
    }
]

let person;

for(let val of arr){
    if(val.name === "Jerry");
    person = val;
    break;
}
复制代码

那么在ES6当中,查找一个符合要求的元素将变得特别简单。 我们可以使用find()函数来查找数组中符合要求的元素。该方法接收一个函数,函数的参数分别对应着 item,index,array

arr.find((item, index, arr) => {
    if(item == "Jerry"){
        return true;
    }
    else {
        return false;
    }
    
})
复制代码

当然,我们可以写得更加优美的代码如下:

arr.find(item => item == “Jerry”) findIndex 同样的,有些时候,我们在循环外,想要获得某个数组元素的索引值,ES6同样给我们提供了语义更清晰,更好用的findIndex。

我现在想要拿到名字是Alex的人在数组中的index。那么,使用findIndex可以这么写。

const index = arr.findIndex(item => name == "Alex");
复制代码

some some方法见名知意,就是为了查看数组中,是否有特定的元素满足条件的。我现在的需求是想知道,数组元素中,是否有一个人的年龄是大于20岁的。使用some方法可以快速的做到这件事。

arr.some(item => item.age > 20) //true
复制代码

该方法只要查找到元素中有任何一个元素满足条件,就会返回true

every every方法是针对于some方法的,该方法必须查找到数组中全部元素都满足条件才回返回true,如果有一个不满足条件,就返回false,并终止循环。

现在我想查看是否所有人都大于17岁

arr.every(item => item.age>17); //true
复制代码

新增的对象方法 Object.assign() 该方法主要用于拷贝一个对象的属性值到另一个对象。可以接受多个参数。该方法会直接修改第一个对象的属性。并返回拷贝后的对象,需要注意的是,该方法实现的是浅拷贝。

var obj1 = {
        name: 'first',
        desc: 'second'
    }

var obj2 = {
        color: 'red',
        hop: 'go'
    }

var obj3 = {
        background: 'skyblue'
    }

var obj4 = Object.assign(obj1, obj2, obj3);
console.log(obj4)   
/*
background: "skyblue"
color: "red"
desc: "second"
hop: "go"
name: "first"*/
console.log(obj1)
/*
background: "skyblue"
color: "red"
desc: "second"
hop: "go"
name: "first"*/
复制代码

Object.keys(); 返回该对象的所有属性名数组;

var obj1 = {
        name: 'first',
        desc: 'second'
    }

console.log(Object.keys(obj1))

/*
0: "name"
1: "desc"
*/
复制代码

Object.values(); 返回该对象所有属性值的数组;

var obj1 = { name: ‘first’, desc: ‘second’ }

console.log(Object.values(obj1))

/*
0: "first"
1: "second"
*/
复制代码

Object.entries() 返回该对象的键值对数组;

 var obj1 = {
            name: 'first',
            desc: 'second'
        }
    
console.log(Object.entries(obj1))

/*
["name", "first"],
["desc", "second"]
*/
复制代码

由于数组也属于对象,只是属于比较特殊的对象,所以,数组自身继承了entries方法。所以该方法可以结合for of 以及数组解构使for of循环循环数组时,也能得到index值;

var arr = ["鸡肉", "牛肉", "烤鱼"];

for([index, value] of arr.entries()) {
    console.log("索引值", index);
    console.log("数组项", value);
}
复制代码

image

Object.fromEntries(); 该方法是entries方法的逆运算,需要注意的是,支持该方法的浏览器并不多。

var obj = Object.fromEntries([
        ["property1", "value1"],
        ["property2", "value2"],
    ])

console.log(obj);
复制代码

image 可以通过增加Object原型对象方法实现polyfill.

Object.defineProperty(Object.prototype, "fromEntries", {
        enumerable: false,
        value(arr) {
            var obj = {};
            for(var i = 0; i < arr.length; i++) {
                obj[arr[i][0]] = arr[i][1]
            }
            return obj;
        },
        configurable: true,
        writable: true
    })复制代码

转载于:https://juejin.im/post/5c6ea15151882562914ed501