数组的常用方法

  • 数组的变更方法和替换数组

转载网址:https://blog.51cto.com/zhanglida66/1921562

1.变更方法(改变原数组)

  • push()
    在数组的末尾添加元素,并返回新的长度
 a=[1,2,3];
 a.push(5,6,7));  // 6
 a; // [1,2,3,5,6,7]
  • pop()
    从数组中把最后一个元素删掉,并返回这个元素的值
 a=[1,2,3];
 a.pop();  // 3
 a; // [1,2]
  • shift()
    从数组中把第一个元素删掉,并返回这个元素的值
 a=[1,2,3]; 
 a.shift();   // 1
 a; // [2,3]
  • unshift()
    在数组的开头添加一个或更多的元素,并返回新的长度
 a=[1,2,3];
 a.unshift(5,6));  // 5
 a; // [5,6,1,2,3]

记忆点:shift,pop是删元素,返回的是被删元素的值;unshift,push是新增元素,返回的是新的长度。

  • splice()
    splice() 方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素。然后返回被删除的项目。
    语法:
arrayObject.splice(index,howmany,item1,.....,itemX)

其中:index 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany 必需。要删除的项目数量。如果设置为 0,则不会删除项目。
item1, ..., itemX 可选。向数组添加的新项目。

//新增一个元素
a=['A','B','C','D','E','F']
a.splice(2,0,'addItem');  //[]
a; // ["A", "B", "addItem", "C", "D", "E", "F"]
//删除一个元素
a=['A','B','C','D','E','F']
a.splice(2,2);  //["C", "D"]
a; // ["A", "B", "E", "F"]
//同时新增和删除
a=['A','B','C','D','E','F']
a.splice(2,2,'addItem1','addItem2');  //["C", "D"]
a; // ["A", "B", "addItem1", "addItem2", "E", "F"]
  • sort()
    sort() 方法用于对数组的元素进行排序。

  • reverse()
    reverse() 方法用于颠倒数组中元素的顺序。

  • forEach()
    forEach(): 没有返回值,本质上等同于 for 循环,对每一项执行 function 函数。即map是返回一个新数组,原数组不变,forEach 是改变原数组。

  tempAddressData.forEach(item => {
    item.precinctName = self.removeLastUnderline(item.precinctName);
    item.standardAddress = self.removeLastUnderline(item.standardAddress);
  })

2.替换数组(不改变原数组,生成新数组)

  • filter()



    可以用来找出数组中符合某些条件的对象数组,其中filter写了{}里面的要return,没写{}不加return
    https://www.cnblogs.com/ymhweb/p/15221608.html

  • concat()
    concat() 方法用于连接两个或多个数组。返回值:返回连接后的新数组

a=['A','B','C']
a.concat('addItem1','addItem2');  //["A", "B", "C", "addItem1", "addItem2"]
a; // ['A','B','C']
  • slice()
    slice() 方法可从已有的数组中返回选定的元素。
a=['A','B','C','D','E','F']
a.slice(1,4);  // ["B", "C", "D"]
a; // ['A','B','C','D','E','F']
  • map()
    map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。不改变原数组。
a = [1, 2, 3, 4, 5];
a.map((item) => {
    return item * item;
}); // [1, 4, 9, 16, 25]
a; // [1, 2, 3, 4, 5]
  • 对象数组的比较

  • 返回根据uniqueName在第二个数组中,但不在第一个数组中的元素
compareArray: function (array1, array2) {
       var result = []
       for (var i = 0; i < array2.length; i++) {
         var obj = array2[i]
         var name2 = obj.uniqueName;
         var isExist = false
         for (var j = 0; j < array1.length; j++) {
           var aj = array1[j]
           var name1 = aj.uniqueName;
           if (name1 === name2) {
             isExist = true;
             break
           }
         }
         if (!isExist) {
           result.push(obj)
         }
       }
       return result;
     }
  • 返回被修改的对象
compareModifiedArray: function (array1, array2) {
       var result = [];
       for (var i = 0; i < array2.length; i++) {
         var obj = array2[i]
         var name2 = obj.uniqueName;
         var number2 = obj.uniqueNumber;
         for (var j = 0; j < array1.length; j++) {
           var aj = array1[j];
           var name1 = aj.uniqueName;
           var number1 = aj.uniqueNumber;
           if ((name1 === name2) && (number1 !== number2)) {
             result.push(obj);
           }
         }
       }
       return result;
     }
  • 检查对象数组中是否有相同key的键值
isExistUniqueKeyValueArray: function (array) {
        var s = new Set();
        array.forEach(item => s.add(item.UniquekeyName));
        if (s.size == array.length) {
          return false;
        } else {
          return true;
        }
      }
  • 检查两个对象数组是否相等
 JSON.stringify(a1) == JSON.stringify(a2)
或  a1.toString() == a2.toString()
  • 其他数组的方法

  • for...of 和 for...in
    for...of 用于遍历一个迭代器,如数组:(取的是属性)
    优点:随时停止或退出 for...of 循环。
    不用担心向对象中添加新的属性。for...of 循环将只循环访问对象中的值。
// 使用for...of循环:
let letters = ['a', 'b', 'c'];
letters.size = 3;
for (let letter of letters) {
  console.log(letter);
}
// 结果: a, b, c

for...in 用来遍历对象中的属性:(取的是下标)

// 使用for...in循环:
let stus = ["Sam", "22", "男"];
 for (let stu in stus) {
   console.log(stus[stu]);
  }
// 结果: Sam, 22, 男
  • join
    作用:用指定的分隔符将数组每一项拼接为字符串
    参数:指定的分隔符,如果省略该参数,则使用逗号作为分隔符
    返回值:拼接好的字符串
    是否改变原数组:不改变
var ary = [1,2,3,4,5];
var res = ary.join('-');
console.log(ary);  // [1, 2, 3, 4, 5]
console.log(res);  // 1-2-3-4-5
  • 对象数组找出符合条件的一项的下标:
arr.findIndex(val => {
    return val.value === 'second'
}) //1
  • 数组中是否包含特定的值-includes(字符串也有includes):


    includes.png
  • 生成长度为9的空字符串数组
let m = Array(9).fill('')
const xData =  Object.keys(Array.apply(null, {length:100})).map(function(item){
    return +item+1;
});
  • js遍历对象数组时删除不符合的元素
for (var i = 0; i < list.length; i++) {
            if (list[i]["status"] == 1) {
                list.splice(i, 1);
                i--;
            }
  • 从对象数组中取部分字段作为新的数组
params.ruleDeploys = tempRuleDeploysData.map((item) =>{
                        return {
                            watchObId: item.watchObId,
                            watchObType: item.watchObType,
                            timingValue: item.timingValue}
                    })
let keys = ['fields', 'schemaId', 'value', 'keyword']
keys.forEach((item) => {
    filters.startVertices[item] = filter.startParam[item]
})

  • 对象数组中某一字段里的值相同进行分组
 A=[{'name': '小明','age':'15','job':'学生','hobby':'篮球'
},
{'name': '小红','age':'12','job':'学生','hobby':'游泳'},
{
    'name': '小明','age':'21','job':'主持人','hobby':'相声'
},
{
    'name': '小明','age':'28','job':'程序员','hobby':'睡觉'
},
{
    'name': '小华','age':'23','job':'歌手','hobby':'唱歌'
},
{
    'name': '小华','age':'27','job':'歌手1','hobby':'唱歌'
}];
const c = []
const d = {}
A.forEach(item => {
    if(d[item.name] === undefined) {
        d[item.name] = c.length
        c.push([item])
    } else {
        c[d[item.name]].push(item)
    }
})

//c的值
[[{
    'name': '小明','age':'15','job':'学生','hobby':'篮球'
},
{
    'name': '小明','age':'21','job':'主持人','hobby':'相声'
},
{
    'name': '小明','age':'28','job':'程序员','hobby':'睡觉'
}],
[{
    'name': '小红','age':'12','job':'学生','hobby':'游泳'
}],[{
    'name': '小华','age':'23','job':'歌手','hobby':'唱歌'
}]]
  • 根据一个数组过滤另一个数组对象
A=[{'name': '小明','age':'15','job':'学生','hobby':'篮球'
},
{'name': '小红','age':'12','job':'学生','hobby':'游泳'},
{
    'name': '小黄','age':'21','job':'主持人','hobby':'相声'
},
{
    'name': '小白','age':'28','job':'程序员','hobby':'睡觉'
},
{
    'name': '小华','age':'23','job':'歌手','hobby':'唱歌'
}];
B=['小明','小华']
let tempMap = {}
B.forEach(item => {
    tempMap[item] = item
})
newArray = A.filter(v => {
    return tempMap[v.name]
})
//newArray的值
A=[{'name': '小明','age':'15','job':'学生','hobby':'篮球'
},
{'name': '小华','age':'23','job':'歌手','hobby':'唱歌'
}];
let arr1 = [
    { id: 1, name: '张三', age: 20, hobby: ['吃饭', '睡觉', '打豆豆'] },
    { id: 2, name: '李四', age: 21, hobby: ['吃饭', '睡觉', '打豆豆'] },
    { id: 3, name: '王五', age: 22, hobby: ['吃饭', '睡觉', '打豆豆'] },
    { id: 4, name: '赵六', age: 23, hobby: ['吃饭', '睡觉', '打豆豆'] }
]
let arr2 = [
    { id: 3, name: '王五' },
    { id: 4, name: '赵六' }
]
//因为arr2中的信息比较简单,我们需要根据arr2中的 id 字段进行判断,获取arr1中相同 id 字段的详细信息(不仅仅包括id、name,也需要包括age、hobby)并返回
let arr = arr1.filter( item => {
    return arr2.find( prop => {
        return prop.id == item.id
    })
})

console.log(arr)
// 输出结果
[
  { id: 3, name: '王五', age: 22, hobby: [ '吃饭', '睡觉', '打豆豆' ] },
  { id: 4, name: '赵六', age: 23, hobby: [ '吃饭', '睡觉', '打豆豆' ] }
]

  • 检测一个对象数组是否有某个元素的值有多条
const checkForDuplicates = (array, property) => {
  let flag = false
  const seenValues = new Set();
  const duplicates = new Set();
  array.forEach(item => {
    const propValue = item[property];
    if (seenValues.has(propValue)) {
      duplicates.add(propValue);
    } else {
      seenValues.add(propValue);
    }
  });
  flag = duplicates.size > 0 ? true : false
  return flag
}
  • 检测一个对象数组某个元素的属性值有多少条
const countByPropertyValue = (array, propertyName, value) => {
  return array.filter(item => item[propertyName] === value).length;
}
  • 总结


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容