JS 操作数组

  1.  数组的创建和赋值
    两种方式创建:
    1)字面量方式 var arr = ['you','me','their']
    2)使用 new 关键字创建(构造函数)  var arr = new Array();

    数组赋值:

    var arr = [];
    arr[0] = 123;
    arr[1] = '第三个发';
    arr[2] = '命运交响曲'
  2. 类数组
    arguments , HTMLClection , NodeList

    //将foo的参数传给bar
    function foo(){
        bar.apply(this, arguments)
    }
    
    function bar(a,b,c){
        console.log(a,b,c)
    }
    
    foo(1,2,3)

  3. 数组方法 列举30个
    1)改变原数组:shift、unshift 、pop、push、sort、reverse、splice
    2)不改变原数组:slice、 concat、 join 、filter、some、map、find、toReverted 、toSorted、toSpliced、with

    length属性 在末尾添加一个新项,返回有一个新的数组。

    var arr = ["1","2","3"];
    arr[arr.length]="4"; //在坐标为 length 的位置添加一个新项
    console.log(arr) //返回为【“1”,“2”,“3”,“4”】

    shift() 删除数组的第一个元素,返回删除的值。 //0
    unshift(3,4) 把参数添加到数组头部,返回数组的长度。// [3,4,0,1,2].unshift[0] -> 6
    pop() 删除数组的最后一个元素,返回删除的值。//2
    push(3) 将参数添加到数组最后,返回数组的长度。(可以添加多个,以逗号隔开)// [0,1,2,3]
    reverse() 数组反序 。
    sort(orderfunction)  按照参数指定的方法进行排序 
    splice(i,n) 删除从i(索引值)开始之后的n个元素,返回值是删除的元素。splice(start,deleteCount,val1,val2,...)  从start位置开始删除deleteCount 项,并从该位置起插入值val1,val2,... 


    str.split() 将字符串转化为数组
    slice(start,end) 返回参数区间的值作为新数组输出(首项下标0,左闭右开)。
    concat(3,4) 把两个数组拼接起来。//[0,1,2,3,4]
    join() 返回字符串,包含数组中的所有元素由指定的分隔符分隔。
    map() filter() some() erery()
    .toSpliced() 非破坏性版本,它会返回原数组变更后的版本,因此我们拿不到被删除的元素

    const array = [1, 2, 3, 4, 5, 6];
    const result = array.tospliced(1, 2, 0);
    console.log(result); //  [1, 0, 4, 5, 6]
    console.log(array);  // [1, 2, 3, 4, 5, 6]

    .toSorted() 是 .sort() 的非破坏性版本:

    const array = ['c', 'o', 'n', 'a', 'r', 'd', 'l', 'i'];
    const result = array.toSorted();
    console.log(result); //  ['a', 'c', 'd', 'i', 'l', 'n', 'o', 'r']
    console.log(array); // ['c', 'o', 'n', 'a', 'r', 'd', 'l', 'i']

    .toReversed() 是 .reverse() 的非破坏性版本:

    const array = ['c', 'o', 'n', 'a', 'r', 'd', 'l', 'i'];
    const result = array.toReversed();
    console.log(result); //  ['i', 'l', 'd', 'r', 'a', 'n', 'o', 'c']
    console.log(array); // ['c', 'o', 'n', 'a', 'r', 'd', 'l', 'i']

    .find(callback) 找到第一个符合条件的数组成员
    .findIndex(callback) 找到第一个符合条件的数组成员的索引值
    .fill(target, start, end) 使用给定的值,填充一个数组,ps:填充完后会改变原数组
    .includes() 判断数中是否包含给定的值

    toString() 直接转换为字符串,每个元素之间用逗号隔开。
    isArray() 判断一个对象是否为数组类型 ,返回布尔值 true / false。


    .keys() 遍历数组的键名
    .values() 遍历数组键值
    .entries() 遍历数组的键名和键值
    .forEach(callback) 遍历数组,无return
    .map(callback) 映射数组(遍历数组),有return 返回一个新数组
    .every(callback) 依据判断条件,数组的元素是否全满足,若满足则返回ture
    .some() 依据判断条件,数组的元素是否有一个满足,若有一个满足则返回ture

    arr.filter(a => !['l','i'].includes(a)) 过滤数组,返回一个满足要求的数组
    arr.reduce(callback, initialValue) 迭代数组的所有项,累加器,数组中的每个值(从左到右)合并,最终计算为一个值
    arr.reduceRight(callback, initialValue) 与arr.reduce()功能一样,不同的是,reduceRight()从数组的末尾向前将数组中的数组项做累加。

    .indexOf() 
    查找某个元素的索引值,若有重复的则返回第一个查到的索引值,若不存在则返回 -1
    .lastIndexOf()   和arr.indexOf()的功能一样,不同的是从后往前查找
    Array.from() 将伪数组变成数组,就是只要有length的就可以转成数组。 ---es6
    Array.of() 将一组值转换成数组,类似于声明数组    ---es6

    .with() 是对数组的某个元素赋值操作 array[index] = value 的非破坏性版本,如果我们只是想得到一个新数组,又不想改变原数组,可以这样用:

    const array = ['c', 'o', 'n', 'a', 'r', 'd', 'l', 'i'];
    const result = array.with(0, 'ConardLi')
    console.log(result); //  ['ConardLi', 'o', 'n', 'a', 'r', 'd', 'l', 'i'];
    console.log(array); // ['c', 'o', 'n', 'a', 'r', 'd', 'l', 'i']


    .copyWithin() 在当前数组内部,将指定位置的数组复制到其他位置,会覆盖原数组项,返回当前数组

     
     

  4. 数组排序 arr.sort()
    sort()方法将在原数组上进行排序,即排序时不创建新的数组副本。
    sort()没有使用参数,将按照字符编码的顺序排序。首先应把数组的元素都转换成字符串(如果有必要的话),以便进行比较。
    如果想按照别的顺序进行排序,就必须提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数a和b,
    sort(function(a,b){}) 根据设定的评判标准,其返回值如下:

    var a = [1, 4, 2, 3, 5];
    var b = a.sort();
    console.log(a, b);  //[ 1, 2, 3, 4, 5 ] [ 1, 2, 3, 4, 5 ]

    如果a<b,排序后a应该出现在b之前,就返回一个小于0的值。
    如果a等于b,就返回0。
    如果a大于b,就返回一个大于0的值。

    注意,数组中undefined的元素都排列在数组末尾。即使你提供了自定义的排序函数也是这样,因为undefined值不会被传递给你提供的orderfunc

    数字数组进行由小到大的顺序

    var arr = [22,12,3,43,56,47,4];
    arr.sort();
    console.log(arr); // [12, 22, 3, 4, 43, 47, 56]
    arr.sort(function (m, n) {
     if (m < n) return -1
     else if (m > n) return 1
     else return 0
    });
    console.log(arr); // [3, 4, 12, 22, 43, 47, 56]

    字符串数组不区分大小写排序

    var arr = ['abc', 'Def', 'BoC', 'FED'];
    console.log(arr.sort()); // ["BoC", "Def", "FED", "abc"]
    console.log(arr.sort(function(s, t){
     var a = s.toLowerCase();
     var b = t.toLowerCase();
     if (a < b) return -1;
     if (a > b) return 1;
     return 0;
    })); // ["abc", "BoC", "Def", "FED"]

     对象数组的属性值排序

    var arr = [{'name': '张三', age: 26},{'name': '李四', age: 12},{'name': '王五', age: 37},{'name': '赵六', age: 4}];
    var objectArraySort = function (keyName) {
     return function (objectN, objectM) {
      var valueN = objectN[keyName]
      var valueM = objectM[keyName]
      if (valueN < valueM) return 1
      else if (valueN > valueM) return -1
      else return 0
     }
    }
    arr.sort(objectArraySort('age'))
    console.log(arr) // [{'name': '王五', age: 37},{'name': '张三', age: 26},{'name': '李四', age: 12},{'name': '赵六', age: 4}]
    


     

  5. 数组遍历的几种方法: every(), filter(), forEach() , map(), some()
    CSDN

  6. 数组去重哪个方法效率高:
    CSDN

  7. 数组扁平化 CSDN

  8. 用 js 实现随机选取 10 -100 之间的 10 个数字,存入一个数组并排序。

    function randomNum(aArray, len, min, max) {
        if (len >= (max - min)) {
            return '超过' + min + '-' + max + '之间的个数范围' + (max - min - 1) + '个的总数';
        }
        if (aArray.length >= len) {
            aArray.sort(function (a, b) {
                return a - b
            });
            return aArray;
        }
        // console.log(aArray)
        let nowNum = parseInt(Math.random() * (max - min - 1)) + (min + 1);
        for (let j = 0; j < aArray.length; j++) {
            if (nowNum === aArray[j]) {
                randomNum(aArray, len, min, max);
                return;
            }
        }
        aArray.push(nowNum);
        randomNum(aArray, len, min, max);
        return aArray;
    }
    let arr = [];
    console.log(randomNum(arr, 10, 10, 100));

     输出结果:

    [ 12, 15, 18, 24, 25, 30, 31, 32, 42, 50 ]

    [ 27, 34, 35, 51, 59, 60, 78, 82, 86, 89 ]

  9. ES5 实现数组 map 方法

    var selfMap = function(fn,context){
        var arr = Array.prototype.slice.call(this)
        var mappedArr = []
        for (let i=0;i<arr.length;i++){
            mappedArr.push(fn.call(context,arr[i],i,this))
        }
        return mappedArr
    }

    Array.prototype.slice.call() 可以理解为:改变数组的 slice 方法的作用域,在特定的作用域中去调用 slice 方法。

    call() 方法是在特定的作用域中调用函数,实际上等于设置函数体内 this对象的值,call 方法的第一个参数是特定的作用域。

     

  10. 向JavaScript 固有类型 Array 扩展一个取最小值方法

    Array.prototype.min = function () {
        let min = this[0];
        for (let i = 1; i < this.length; i++) {
            if (this[i] < min) {
                min = this[i]
            }
        }
        return min;
    }
    
    console.log([1, 56, 34, 12].min());  //1

    陷阱:向Array 的原型中扩展了min方法后,使用 for .in . 循环时会拿到这个 min() 方法 

    let arr = [1, 56, 34, 12];
    let total = 0;
    for (let i in arr) {
        total += parseInt(arr[i], 10);
    }
    console.log(total);   // NaN
    var arr = [1, 56, 34, 12];
    var total = 0;
    for (var i in arr) {
        console.log('=' + arr[i])
        if (Array.hasOwnProperty(i)) {
            total += arr[i]
        }
        console.log(total);
    } 
    
    //输出:
    1
    0
    56
    0
    34
    0
    12
    0
    [Function]
    0



     

  11. 删除数组中指定索引的项

    const arr = [
      { photo: "photo" },
      { name: "name" },
      { phoneNumber: "phoneNumber" },
      { part: "part" },
      { role: "role" },
      { name: "fsdfvzxc94" },
      { name: "fsdfvzxc80" },
      { name: "fsdfvzxc68" },
      { name: "fsdfvzxc54" },
      { name: "fsdfvzxc92" }
    ]
    
    function remove(array, index) {
      if (index <= (array.length - 1)) {
        for (var i = index; i < array.length; i++) {
          array[i] = array[i + 1];
        }
      }
      else {
        throw new Error('超出最大索引!');
      }
      array.length = array.length - 1;
      return array;
    }
    console.log(remove(arr , 2));


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值