JS对象:数组

创建数组

  • 构造函数
 var a1 = new Array(5);
       console.log(a1.length);//5
       console.log(a1); //[] ,数组是空的
  • 字面量
  var b = [1, 2, 'hello'];

基本方法:push、pop、shift、unshift、join、splice、sort、join、reverse、concat;

var arr = [ 0,1,1,2,3,5,8,13,21,34,55]
arr.push("a");
console.log(arr);
arr.pop("a");
console.log(arr);
arr.unshift("a");
console.log(arr);
arr.shift("a");
console.log(arr);
arr.splice(2,2,"a" ,"b");
console.log(arr);
console.log(arr.join("/"));
var arr1=["b"];
console.log(arr.concat(arr1));
console.log(arr);
console.log(arr.reverse());
console.log(arr.sort());
arr.sort(function(v1,v2){
    return v1 - v2;
})
console.log(arr);

用 splice函数分别实现 push、pop、shift、unshift方法。

  function push(arr, value){
    arr.splice(arr.length, 0, value)
    return arr.length
}
var arr = [3, 4, 5]
arr.push(10)
  function pop(arr){
        arr.splice(arr.length-1,1,0)
        return arr.length;
    }
    arr.pop();
    console.log(arr);
    function unshift(arr,value){
        arr.splice(0,0,value)
        return arr.length
    }
    arr.unshift(1);
    console.log(arr);
    function shift(arr){
        arr.splice(0,1,0)
        return arr.length;
    }
    arr.shift();
    console.log(arr);

ES5 数组拓展

  • .indexOf(element) / .lastIndexOf(element):用于查找数组内指定元素位置,查找到第一个后返回其索引,没有查找到返回-1,indexOf从头至尾搜索,lastIndexOf反向搜索。
  • .forEach(element, index, array)
  • .every(function(element, index, array)) / .some(function(element, index, array)):
    这两个函数类似于离散数学中的逻辑判定,回调函数返回一个布尔值:
    every是所有函数的每个回调函数都返回true的时候才会返回true,当遇到false的时候终止执行,返回false
    some函数是“存在”有一个回调函数返回true的时候终止执行并返回true,否则返回false
  • .map(function(element)):与forEach类似,遍历数组,回调函数返回值组成一个新数组返回,新数组索引结构和原数组一致,原数组不变
  • .filter(function(element))
    返回数组的一个子集,回调函数用于逻辑判断是否返回,返回true则把当前元素加入到返回数组中,false则不加
    新数组只包含返回true的值,索引缺失的不包括,原数组保持不变
  • .reduce(function(v1, v2), value) / .reduceRight(function(v1, v2), value):
    遍历数组,调用回调函数,将数组元素组合成一个值,reduce从索引最小值开始,reduceRight反向,方法有两个参数
    回调函数:把两个值合为一个,返回结果
    value,一个初始值,可选
    var a = [1,2,3,4,5,6,3,2,1]
    console.log(a.indexOf(2)) //1
    console.log(a.lastIndexOf(2)) //7
    a.forEach(function(e,i,arr){
        arr[i]=e*e;
    });
    console.log(a);//[1, 4, 9, 16, 25, 36, 9, 4, 1]

    console.log( a.every(function(e,i,arr){
        return e > 5;
    }));//false
    console.log( a.some(function(e,i,arr){
        return e > 5;
    }));//true
    console.log(a.map(function(e){
        return e * e
    }));//[1, 16, 81, 256, 625, 1296, 81, 16, 1]
    console.log(a);//[1, 4, 9, 16, 25, 36, 9, 4, 1]
    console.log(a.filter(function(e){
        return e % 2 == 0;
    }))//[4, 16, 36, 4]
    console.log(a)// [1, 4, 9, 16, 25, 36, 9, 4, 1]
    var b = a.reduce(function(v1, v2){
        return v1 + v2 });
    console.log(b);// 105
    var c = a.reduceRight(function(v1, v2){
        return v1 + v2 }, 10)
    console.log(c);//115

范例:

写一个函数,操作数组,返回一个新数组,新数组中只包含正数。

function filterPositive(arr){
  var arr1 = [];
  for(var i = 0; i< arr.length; i++ ){
    if(typeof arr[i] === "number" && arr[i] > 0){
      arr1.push(arr[i])
    }
  }
  return arr1;
}
var arr = [3, -1,  2,  '饥人谷', true]
var arr = filterPositive(arr)
console.log(arr)   // [3,2]

对以下代码 users中的对象,分别以 name 字段、age 字段、company 字段进行排序

   var users = [
        { name: "John", age: 20, company: "Baidu" },
        { name: "Pete", age: 18, company: "Alibaba" },
        { name: "Ann", age: 19, company: "Tecent" }
    ]
    var sortByName = users.sort(function(v1,v2){
        return v1.name > v2.name;
    });
        console.log(sortByName);
    var sortByAge = users.sort(function(v1,v2){
        return v1.age - v2.age;
    });
         console.log(sortByAge);
    var sortByCompany = users.sort(function (v1,v2){
        return v1.company > v2.company;
    } );
    
       console.log(sortByCompany);

实现一个reduce函数,作用和原生的reduce类似下面的例子。

   var sum = reduce([1, 2, 3], function(memo, num){ return memo + num; }, 0); //6
   function reduce(arr,iterate,initValue){
       var tmpArr = (initValue === undefined ?[]:[initValue].concat(arr))
       while(tmpArr.length>1){
           tmpArr.splice(0,2,iterate(tmpArr[0],tmpArr[1]));
       }
       return tmpArr[0];
   }
   var sum = reduce([3,5,6],function(v1,v2){
       return v1 + v2;
   },10);
   console.log(sum);//24

实现一个flatten函数,将一个嵌套多层的数组 array(数组) (嵌套可以是任何层数)转换为只有一层的数组,数组中元素仅基本类型的元素或数组,不存在循环引用的情况

    function flatten(arr){
        return arr.reduce(function(arr1,arr2){
            return arr1.concat(Array.isArray(arr2)?flatten(arr2):arr2)
        },[])
    }
    function flatten2(arr){
        var newArr= [];
            arr.forEach(function(e){
                if(Array.isArray(e)){
                    newArr=newArr.concat(flatten2(e));
                }else {
                    newArr.push(e);
                }
            })
        return newArr;
    }
var arr = [3, [2, -4, [5, 7]], -3, ['aa', [['bb']]]]
    var arr1=flatten(arr);
    console.log(arr1);//[3, 2, -4, 5, 7, -3, "aa", "bb"]
    var arr2=flatten2(arr);
    console.log(arr2);//[3, 2, -4, 5, 7, -3, "aa", "bb"]

作者:彭荣辉
链接:https://www.jianshu.com/u/0f804364a8a8
來源:
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(JS对象:数组)