數(shù)組和對象方法&數(shù)組去重

列舉一下JavaScript數(shù)組和對象有哪些原生方法?
數(shù)組:
  • arr.concat(arr1, arr2, arrn);--合并兩個或多個數(shù)組。此方法不會修改原有數(shù)組,而是返回一個新數(shù)組
  • arr.fill(value,start,end) ;--用一個固定值填充一個數(shù)組中從起始索引到終止索引內(nèi)的全部元素。此方法修改原有數(shù)組
  • arr.filter((element,index,array)=>{},this) ;--filter方法過濾數(shù)組,返回一個新數(shù)組, 其保留 通過所提供函數(shù)測試的 所有元素。此方法不會修改原有數(shù)組
  • arr.reduce((previousValue,currentValue,index,array) => {},initialValue);--reduce方法迭代數(shù)組的所有項,又稱為“累加器”,返回函數(shù)最終計算的一個值。
  • arr.join(",");--將一個數(shù)組的所有元素連接成一個字符串返回。不會修改原有數(shù)組
  • arr.sort();--對數(shù)組的元素進行排序,并返回數(shù)組。此方法修改原有數(shù)組
  • arr.unshift(e1, e2, en);--添加元素到數(shù)組的頭部,返回該數(shù)組的新長度。此方法修改原有數(shù)組
  • arr.push(e1, e2, en);--添加元素到數(shù)組的尾部,返回該數(shù)組的新長度。此方法修改原有數(shù)組
  • arr.pop();--刪除數(shù)組尾部的元素。此方法修改原有數(shù)組
  • arr.shift();刪除數(shù)組頭部的元素。此方法修改原有數(shù)組
  • arr.splice(index, count);--刪除任意位置元素的方法。此方法修改原有數(shù)組
  • arr.reverse();--將數(shù)組中元素的位置顛倒,并返回該數(shù)組。此方法修改原有數(shù)組
  • arr.slice(start, end);--包頭不包尾的截取數(shù)組中的一段,并返回新數(shù)組。不會修改原有數(shù)組
  • arr.splice(index, count, e1, e2, en);--添加元素到數(shù)組的任何位置。此方法修改原有數(shù)組
  • arr.indexOf(searchElement,fromIndex);--返回在數(shù)組中可以找到一個給定元素的第一個索引,如果不存在,則返回-1。
  • arr.includes(searchElement,fromIndex); // ES6 --判斷一個數(shù)組是否包含一個指定的值,根據(jù)情況,返回布爾值。
  • arr.map((currentValue,index,array) => {} ,this);--創(chuàng)建一個新數(shù)組,其結(jié)果是該數(shù)組中的每個元素是調(diào)用一次提供的函數(shù)后的返回值。此方法不會修改原有數(shù)組
  • arr.forEach((currentValue,index,array) => {} ,this);--對數(shù)組的每個元素執(zhí)行一次給定的函數(shù)。
  • arr.from(arrayLike,(currentValue) => {} ,this);--從一個類似數(shù)組或可迭代對象創(chuàng)建一個新的數(shù)組,淺拷貝的數(shù)組實例。此方法修改原有數(shù)組
  • arr.find((element,index,array) => {} ,this);--返回數(shù)組中滿足提供的測試函數(shù)的第一個元素的值。否則返回 undefinedfind方法不會改變數(shù)組
  • arr.findIndex((element,index,array) => {} ,this);-- 返回數(shù)組中滿足提供的測試函數(shù)的第一個元素的索引。若沒有找到對應(yīng)元素則返回-1。findIndex不會修改所調(diào)用的數(shù)組
  • arr.flat(depth);--會按照一個可指定的深度遞歸遍歷數(shù)組,并將所有元素與遍歷到的子數(shù)組中的元素合并為一個新數(shù)組返回。此方法不會修改原有數(shù)組
  • arr.flatMap((currentValue,index,array) => {} ,this);--首先使用映射函數(shù)映射每個元素,然后將結(jié)果壓縮成一個新數(shù)組。與 map 連著深度值為1的 flat幾乎相同,但 flatMap 通常在合并成一種方法的效率稍微高一些。此方法不會修改原有數(shù)組
  • arr.some((element,index,array)=>{},this)--依據(jù)判斷條件,數(shù)組的元素是否有一個滿足,若有一個滿足則返回ture
  • arr.every((element,index,array)=>{},this)--依據(jù)判斷條件,數(shù)組的元素是否全滿足,若滿足則返回ture
對象:
  • Object.assign(); --將所有可枚舉屬性的值從一個或多個源對象分配到目標(biāo)對象,它將返回目標(biāo)對象
  • Object.defineProperty() ;--直接在一個對象上定義一個新屬性,或者修改一個對象的現(xiàn)有屬性,并返回此對象
  • object.hasOwnProperty(prop);--對象自身屬性中是否具有指定的屬性(返回布爾值)
  • Object.getOwnPropertyNames();--返回一個由指定對象的所有自身屬性的屬性名組成的數(shù)組
  • object.propertyIsEnumerable(prop);--判斷指定的屬性是否可枚舉(返回布爾值)
  • object.valueOf();--返回指定對象的原始值
  • object.toString();--返回一個表示該對象的字符串,Object.prototype.toString.call()
  • Object.create();--創(chuàng)建一個新對象,使用現(xiàn)有的對象來提供新創(chuàng)建的對象的proto。
  • Class.prototype.isPropertyOf(object);--測試一個對象是否存在于另一個對象的原型鏈上
  • Object.keys() ;--方法會返回一個由一個給定對象的自身可枚舉屬性組成的數(shù)組
  • Object.values();--方法返回一個給定對象自身的所有可枚舉屬性值的數(shù)組
  • Object.entries();--方法返回一個給定對象自身可枚舉屬性的鍵值對數(shù)組
  • Object.setPrototypeOf() ;--方法設(shè)置一個指定的對象的原型
  • Object.getPrototypeOf() ;--方法返回指定對象的原型
Array.slice() 與 Array.splice() 的區(qū)別?

arr.slice(開始位置(含), 結(jié)束位置(不含)):“讀取”數(shù)組指定的元素,不會對原數(shù)組進行修改;
arr.splice(index, count, [insert Elements]):操作”數(shù)組指定的元素,會修改原數(shù)組,返回被刪除的元素;
index :是操作的起始位置
count = 0 :插入元素,count > 0 :刪除元素;
[insert Elements] :向數(shù)組新插入的元素;

數(shù)組去重方法總結(jié):
  • 方法一、利用ES6 Set去重(ES6中最常用)
//ES6 中的 Set 去重
function unique(array) {
   return Array.from(new Set(array));
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
 //[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]
//{}沒有去重
  • 方法二、利用for嵌套for,然后splice去重(ES5中最常用)
//雙層 for 循環(huán)
function unique(arr) {
   let len = arr.length;
   //雙層循環(huán),外層循環(huán)元素,內(nèi)層循環(huán)時比較值。值相同時,則刪去這個值。
    for (let i=0; i<len; i++) {
        for (let j=i+1; j<len; j++) {
            if (arr[i] == arr[j]) {
                arr.splice(j, 1);
                // splice 會改變數(shù)組長度,所以要將數(shù)組長度 len 和下標(biāo) j 減一
                len--;
                j--;
            }
        }
    }
    return arr;
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
// [1, "true", 15, false, undefined, NaN, NaN, "NaN", "a", Object {  }, Object {  }]
// NaN和{}沒有去重,兩個null直接消失了
  • 方法三、利用indexOf去重
function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    var array = [];
    for (var i = 0; i < arr.length; i++) {
        if (array .indexOf(arr[i]) === -1) {
            array .push(arr[i])
        }
    }
    return array;
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
   // [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {…}, {…}]        
   //NaN、{}沒有去重
  • 方法四、利用sort()
function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return;
    }
    arr = arr.sort()
    var arrry= [arr[0]];
    for (var i = 1; i < arr.length; i++) {
        if (arr[i] !== arr[i-1]) {
            arrry.push(arr[i]);
        }
    }
    return arrry;
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[0, 1, 15, NaN, NaN, "NaN", {…}, {…}, "a", false, null, "true", true, undefined] 
//NaN、{}沒有去重
  • 方法五、利用對象的屬性不能相同的特點進行去重
function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    var arrry= [];
     var  obj = {};
    for (var i = 0; i < arr.length; i++) { 
        if (!obj[arr[i]]) {
            arrry.push(arr[i])
            obj[arr[i]] = 1
        } else {
            obj[arr[i]]++
        }
    }
    return arrry;
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[1, "true", 15, false, undefined, null, NaN, 0, "a",  {...}] 
// //兩個true直接去掉了,NaN和{}去重
  • 方法六、利用includes
function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    var array =[];
    for(var i = 0; i < arr.length; i++) {
            if( !array.includes( arr[i]) ) {//includes 檢測數(shù)組是否有某個值
                    array.push(arr[i]);
              }
    }
    return array
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
 //[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]     
//{}沒有去重
  • 方法七、利用hasOwnProperty
function unique(arr) {
    var obj = {};
    return arr.filter(function(item, index, arr){
        return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
    })
}
    var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
        console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}]  
//所有的都去重了
  • 方法八、利用filter
function unique(arr) {
  return arr.filter(function(item, index, arr) {
    //當(dāng)前元素,在原始數(shù)組中的第一個索引==當(dāng)前索引值,否則返回當(dāng)前元素
    return arr.indexOf(item, 0) === index;
  });
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, "NaN", 0, "a", {…}, {…}]
//{}沒有去重
  • 方法九、利用遞歸去重
function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    var array =[];
    for(var i = 0; i < arr.length; i++) {
            if( !array.includes( arr[i]) ) {//includes 檢測數(shù)組是否有某個值
                    array.push(arr[i]);
              }
    }
    return array
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]     
//{}沒有去重
  • 方法十、利用Map數(shù)據(jù)結(jié)構(gòu)去重
function unique(arr) {
    let map = new Map();
        let array = new Array();  // 數(shù)組用于返回結(jié)果
        for (let i = 0; i < arr.length; i++) {
            if(map .has(arr[i])) {  // 如果有該key值
            map .set(arr[i], true);
        } else {
            map .set(arr[i], false);   // 如果沒有該key值
            array .push(arr[i]);
        }
    }
    return array ;
}
 var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
    console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a",  {...}, {...}]
//{}沒有去重
  • 方法十一、利用reduce+includes
function unique(arr){
    return arr.reduce((prev,cur) => prev.includes(cur) ? prev : [...prev,cur],[]);
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr));
// [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]
  • 方法十二、[...new Set(arr)]
[...new Set(arr)]
//代碼就是這么少----(其實,嚴(yán)格來說并不算是一種,相對于第一種方法來說只是簡化了代碼)
快速的讓一個數(shù)組亂序
var arr = [1,2,3,4,5,6,7,8,9,10];
arr.sort(function(){
    return Math.random() - 0.5;
})
console.log(arr);
判斷是否是數(shù)組
  • Array.isArray(arr)
  • Object.prototype.toString.call(arr) === '[Object Array]'
  • arr instanceof Array
  • array.constructor === Array

參考:最新數(shù)組去重

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容