首页 > 编程语言 >JavaScript 索引、关联、对象数组增删改查循环

JavaScript 索引、关联、对象数组增删改查循环

时间:2023-02-09 11:01:02浏览次数:59  
标签:arr console log JavaScript 改查 var let 数组 增删

阅读目录

索引数组
//1、索引数组
let arr=[1,2,3,4,5];
console.log(arr);

JavaScript 索引、关联、对象数组增删改查循环_回调函数

let arr=[1,2,3,4,5];
arr.push(10);
arr[11]=33;
console.log(arr);

JavaScript 索引、关联、对象数组增删改查循环_其他_02

let arr=[1,2,3,4,5];
delete arr[1];
console.log(arr);

JavaScript 索引、关联、对象数组增删改查循环_其他_03

let arr=[1,2,3,4,5];
arr[2]=99;
console.log(arr);

JavaScript 索引、关联、对象数组增删改查循环_数组_04

let arr=[1,2,3,4,5];
console.log(arr[0]); // 1

循环

let arr=[1,2,3,4,5];
for(let i=0;i<=arr.length-1;i++){
    console.log(i,arr[i]);
}

JavaScript 索引、关联、对象数组增删改查循环_迭代_05

关联数组
let arr=[1,2,3,4,5];
arr["name"]="孙悟空";
arr["age"]="18";

let arr=[1,2,3,4,5];
arr["name"]="孙悟空";
arr["age"]="18";

arr['a']=33;
console.log(arr);

JavaScript 索引、关联、对象数组增删改查循环_数组_06

循环

let arr=[1,2,3,4,5];
arr["name"]="孙悟空";
arr["age"]="18";
arr['a']=33;

for(let i in arr){
    console.log(i,arr[i]);
}

JavaScript 索引、关联、对象数组增删改查循环_JavaScript_07

let arr=[1,2,3,4,5];
arr["name"]="孙悟空";
arr["age"]="18";
arr['a']=33;
console.log(arr.length); // 5
let arr=[1,2,3,4,5];
arr["name"]="孙悟空";
arr["age"]="18";
arr['a']=33;

//只能获取索引数组部分
for(let i=0;i<=arr.length-1;i++){
    console.log(i,arr[i]);
}

JavaScript 索引、关联、对象数组增删改查循环_数组_08

对象
let obj={name:'孙悟空',age:18};
console.log(obj);

JavaScript 索引、关联、对象数组增删改查循环_数组_09

let obj={name:'孙悟空',age:18};
obj["aa"]="bb";
console.log(obj);

JavaScript 索引、关联、对象数组增删改查循环_迭代_10

let obj={name:'孙悟空',age:18};
delete  obj["name"];   
console.log(obj);

JavaScript 索引、关联、对象数组增删改查循环_回调函数_11

let obj={name:'孙悟空',age:18};
obj["age"]=9999;
console.log(obj);

JavaScript 索引、关联、对象数组增删改查循环_其他_12

let obj={name:'孙悟空',age:18};
console.log(obj["age"]); // 18

循环

let obj={name:'孙悟空',age:18};

for(let i in obj){
    console.log(i,obj[i]);
} 

JavaScript 索引、关联、对象数组增删改查循环_其他_13

JavaScript中数组元素删除

操作数组的 length 属性可以直接删除元素,用 delete 可以将元素置为 undefined。

在JavaScript中,除了Object之外,Array类型恐怕就是最常用的类型了。
与其他语言的数组有着很大的区别,JavaScript中的Array非常灵活。
今天我就来总结了一下JavaScript中Array删除的方法。

大致的分类可以分为如下几类:

1、length
2、delete
3、栈方法
4、队列方法
5、操作方法
6、迭代方法
7、原型方法

1、length

JavaScript 中 Array 的 length 属性非常有特点一一它不是只读的。
因此,通过设置这个属性可以从数组的末尾移除项或添加新项,请看下面例子:

var colors = ["red", "blue", "grey"];   //创建一个包含3个字符串的数组
colors.length = 2;
console.log(colors[2]);  //undefined
console.log(colors);

JavaScript 索引、关联、对象数组增删改查循环_其他_14

2、delete 关键字

var arr = [1, 2, 3, 4];
delete arr[0];
 
console.log(arr);   //[undefined, 2, 3, 4]

可以看出来,delete 删除之后数组长度不变,只是被删除元素被置为 undefined 了。

3、栈方法

var colors = ["red", "blue", "grey"];
var item = colors.pop();

console.log(item);      //"grey"
console.log(colors.length);    //2

可以看出,在调用 Pop 方法时,数组返回最后一项,即 ”grey”,数组的元素也仅剩两项。

4、队列方法

队列数据结构的访问规则是FIFO(先进先出),

队列在列表的末端添加项,从列表的前端移除项,使用 shift 方法,它能够移除数组中的第一个项并返回该项,并且数组的长度减 1。

var colors = ["red", "blue", "grey"];
var item = colors.shift();

console.log(item);      //"red"
console.log(colors.length);    //2

5、操作方法

splice() 恐怕要算最强大的数组方法了,
他的用法有很多种,在此只介绍删除数组元素的方法。

在删除数组元素的时候,它可以删除任意数量的项,只需要指定2个参数:要删除的第一项的位置和要删除的项数,例如 splice(0, 2) 会删除数组中的前两项。

var colors = ["red", "blue", "grey"];
var item = colors.splice(0, 1);

console.log(item);      //"red"
console.log(colors);    //["blue", "grey"]

6、迭代方法

所谓的迭代方法就是用循环迭代数组元素发现符合要删除的项则删除,用的最多的地方可能是数组中的元素为对象的时候,根据对象的属性例如ID等等来删除数组元素。

下面介绍两种方法:

第一种用最常见的 ForEach 循环来对比元素找到之后将其删除:

var colors = ["red", "blue", "grey"];

colors.forEach(function(item, index, arr) {
    if(item == "red") {
        arr.splice(index, 1);
    }
});

console.log(colors);

JavaScript 索引、关联、对象数组增删改查循环_回调函数_15
第二种我们用循环中的 filter 方法:

var colors = ["red", "blue", "grey"];
 
colors = colors.filter(function(item) {
  return item != "red"
});

console.log(colors);    //["blue", "grey"]

JavaScript 索引、关联、对象数组增删改查循环_迭代_16
代码很简单,找出元素不是 ”red” 的项数返回给 colors(其实是得到了一个新的数组),从而达到删除的作用。

7、原型方法

通过在 Array 的原型上添加方法来达到删除的目的:

Array.prototype.remove = function (dx) {

  if (isNaN(dx) || dx > this.length) {
    return false;
  }

  for (var i = 0, n = 0; i < this.length; i++) {
    if (this[i] != this[dx]) {
      this[n++] = this[i];
    }
  }
  this.length -= 1;
};

var colors = ["red", "blue", "grey"];
colors.remove(1);
console.log(colors); //["red", "grey"]

JavaScript 索引、关联、对象数组增删改查循环_回调函数_17
在此把删除方法添加给了Array 的原型对象,则在此环境中的所有 Array 对象都可以使用该方法。

尽管可以这么做,但是我们不推荐在产品化的程序中来修改原生对象的原型。

道理很简单,如果因某个实现中缺少某个方法,就在原生对象的原型中添加这个方法,那么当在另一个支持该方法的实现中运行代码时,就可能导致命名冲突。

而且这样做可能会意外的导致重写原生方法。

reverse 将数组反序

reverse 方法的作用是将数组反序,不需要参数,返回值是反序的数组,影响原数组,并且返回值指向原数组。

let arr=[1,2,3];
console.log(arr);

let new_arr=arr.reverse();
console.log(arr);
console.log(new_arr);

JavaScript 索引、关联、对象数组增删改查循环_回调函数_18
1 作用:将数组反序
2 参数:不需要参数
3 返回值:反序的数组,指向原数组
4 是否影响原数组:影响

类数组对象转换成数组

slice() 方法可从已有的数组中返回选定的元素

最经典的方法,使用Array的slice方法,此方法如果不传参数的话会返回原数组的一个拷贝,因此可以用此方法转换类数组到数组;

function f1() {
    console.log(arguments);
    //console.log(arguments instanceof Array);
    //console.log(arguments instanceof Object);

    //console.log([]);
    // let arr = Array.prototype.slice.call(arguments);
    // console.log(arr);
    let arr1 = [].slice.apply(arguments);
    console.log(arr1);
}
f1(1,32,43,4);

JavaScript 索引、关联、对象数组增删改查循环_回调函数_19

Array.from() 类数组转换为数组

是ES6中的方法,用于将类数组转换为数组。
只要有length属性的对象,都可以应用此方法转换成数组。

function f1() {
    console.log(arguments);

    let arr = Array.from(arguments);
    console.log(arr);
}
f1(1,32,43,4);

JavaScript 索引、关联、对象数组增删改查循环_JavaScript_20

扩展运算符

function f1() {
    console.log(arguments);

    //1,32,43,4
    console.log(...arguments);
    let arr = [...arguments];
    console.log(arr);
}
f1(1,32,43,4);

JavaScript 索引、关联、对象数组增删改查循环_数组_21

jquery 的 $.makeArray()

jQuery的此方法可以将类数组对象转化为真正的数组

<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script>
  function f1() {
    console.log(arguments);

    let arr = $.makeArray(arguments);
    console.log(arr);
  }
  f1(1, 32, 43, 5);
</script>

JavaScript 索引、关联、对象数组增删改查循环_迭代_22

JavaScript数组常用方法

includes() 判断一个数组是否包含一个指定的值

includes() 方法用来判断一个数组是否包含一个指定的值,如果包含则返回 true,否则返回false。

参数是必带的 valueToFind,和可选的 fromIndex。includes() 方法和 indexOf 方法有点像,不同之处是indexOf方法是返回索引。

作用:
includes() 方法用来判断一个数组是否包含一个指定的值,如果包含则返回 true,否则返回false。

includes 返回布尔值(利于 if 条件判断),indexOf 返回数值。

let arr=[23,43,5,43,2,1,32];
let bool_val=arr.includes(43);
console.log(bool_val); // true
let arr=[23,43,5,43,2,1,32];
let bool_val=arr.includes(43,20);
console.log(bool_val); // false
(function() {
    console.log([].includes.call(arguments, 'a')); // true
    console.log([].includes.call(arguments, 'd')); // false
})('a','b','c');

fill() 固定值填充一个数组

fill() 方法用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。不包括终止索引。参数有必带参数value,可选参数起始索引和终止索引,返回值是修改后的数组,影响原数组

作用:fill()方法用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。不包括终止索引。

参数:必带参数value(用来填充数组元素的值)、可选参数start(起始索引)和end(终止索引)

返回值:修改后的数组。
是否修改原数组:影响原数组

let arr=[1,2,3,5,6,7,8];

//let new_arr=arr.fill(4);
//let new_arr=arr.fill(4,0,2);

let new_arr=arr.fill(4,-5,-1);
console.log(arr);
console.log(new_arr);

JavaScript 索引、关联、对象数组增删改查循环_回调函数_23

find() 返回数组中满足提供的测试函数的第一个元素的值

find() 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined。参数是回调函数

作用:find() 方法返回数组中满足提供的测试函数的第一个元素的值。

参数:回调函数(回调函数参数必带element(当前元素)、可选index(当前元素下标)、可选array(当前数组))

返回值:数组中第一个满足所提供测试函数的元素的值,否则返回 undefined。

let arr=[12,32,43,2,4,11,55,12];
let val=arr.find(function (ele,index) {
  return ele > 32;
});
console.log(val); // 43

findIndex() 返回数组中满足提供的测试函数的第一个元素的索引

作用:findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引。

参数:回调函数(回调函数参数必带 element(当前元素)、可选 index(当前元素下标)、可选array(当前数组))

返回值:数组中通过提供测试函数的第一个元素的索引。否则,返回 -1

let arr=[12,32,43,2,4,11,55,12];

let val=arr.findIndex(function (ele,index) {
  return ele>32;
});

console.log(val); // 2

Array.of() 将一组值转变为数组,参数是要转换成数组的值,返回值是新的数组实例

作用:将一组值转变为数组
参数:要转换成数组的值,elementN
返回值:新的数组实例

let arr=Array.of(1,3,'123',true);
console.log(arr); // [1, 3, "123", true]

JavaScript 索引、关联、对象数组增删改查循环_JavaScript_24

Array.from() 类数组转换为数组

Array.from() 方法的作用是将类数组或可迭代对象转换为数组,比如 String、Map、伪数组等,必带的参数是 arrayLike(想要转换成数组的伪数组对象或可迭代对象),Array.from()方法的返回值是新的数组实例,不影响原结构。

作用:将类数组或可迭代对象转换为数组
参数:必带的 arrayLike(想要转换成数组的伪数组对象或可迭代对象)
返回值:新的数组实例
是否影响原结构:不影响

1、从 String 生成数组

let arr1=Array.from('foo');
console.log(arr1);// [ "f", "o", "o" ]

JavaScript 索引、关联、对象数组增删改查循环_JavaScript_25
2、从 Set 生成数组

const set = new Set(['foo', 'bar', 'baz', 'foo']);
let arr2=Array.from(set);
console.log(arr2);// [ "foo", "bar", "baz" ]

JavaScript 索引、关联、对象数组增删改查循环_JavaScript_26
3、从 Map 生成数组

const map = new Map([[1, 2], [2, 4], [4, 8]]);
console.log(map);// {1 => 2, 2 => 4, 4 => 8}

let arr3=Array.from(map);
console.log(arr3);// [[1, 2], [2, 4], [4, 8]]

JavaScript 索引、关联、对象数组增删改查循环_JavaScript_27

const mapper = new Map([['1', 'a'], ['2', 'b']]);
console.log(mapper);// {"1" => "a", "2" => "b"}

let arr4=Array.from(mapper.values());
console.log(arr4);// ['a', 'b'];

JavaScript 索引、关联、对象数组增删改查循环_迭代_28

let arr5=Array.from(mapper.keys());
console.log(arr5);// ['1', '2'];

从类数组对象(arguments)生成数组

function f() {
	console.log(arguments);
	console.log(Array.from(arguments)); // [ 1, 2, 3 ]
}

console.log(Array);
console.log(Array.from);
console.log(Array.prototype);
console.log([]);

f(1, 2, 3);

JavaScript 索引、关联、对象数组增删改查循环_JavaScript_29

reduce 为数组中的每一个元素依次执行回调函数

reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:

初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用 reduce 的数组。

callback (执行数组中每个值的函数,包含四个参数)

1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
2、currentValue (数组中当前被处理的元素)
3、index (当前元素在数组中的索引)
4、array (调用 reduce 的数组)

initialValue (作为第一次调用 callback 的第一个参数。)
var arr = [1, 2, 3, 4];

var sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
})

console.log(arr, sum);

JavaScript 索引、关联、对象数组增删改查循环_JavaScript_30

var  arr = [1, 2, 3, 4];

var sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
},0) //注意这里设置了初始值

console.log(arr, sum);

打印结果:

0 1 0
1 2 1
3 3 2
6 4 3
[1, 2, 3, 4] 10

这个例子 index 是从 0 开始的,第一次的 prev 的值是我们设置的初始值 0,数组长度是 4,reduce 函数循环 4 次。

结论:如果没有提供 initialValue,reduce 会从索引 1 的地方开始执行 callback 方法,跳过第一个索引。

如果提供 initialValue,从索引0开始。

注意:如果这个数组为空,运用 reduce 是什么情况 ?

var  arr = [];
var sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
})
//报错,"TypeError: Reduce of empty array with no initial value"

但是要是我们设置了初始值就不会报错,如下:

var  arr = [];

var sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
},0)

console.log(arr, sum); // [] 0

reduce 的简单用法

当然最简单的就是我们常用的数组求和,求乘积了。

var  arr = [1, 2, 3, 4];
var sum = arr.reduce((x,y)=>x+y)
var mul = arr.reduce((x,y)=>x*y)

console.log( sum ); //求和,10
console.log( mul ); //求乘积,24

计算数组中每个元素出现的次数

let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];

let nameNum = names.reduce((pre,cur)=>{
  if(cur in pre){
    pre[cur]++
  }else{
    pre[cur] = 1 
  }
  return pre
},{})

console.log(nameNum); // {Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}

JavaScript 索引、关联、对象数组增删改查循环_数组_31

数组去重

let arr = [1,2,3,4,4,1]

let newArr = arr.reduce((pre,cur)=>{
    if(!pre.includes(cur)){
      return pre.concat(cur)
    }else{
      return pre
    }
},[])

console.log(newArr);// [1, 2, 3, 4]

将二维数组转化为一维

let arr = [[0, 1], [2, 3], [4, 5]]

let newArr = arr.reduce((pre,cur)=>{
    return pre.concat(cur)
},[])

console.log(newArr); // [0, 1, 2, 3, 4, 5]

将多维数组转化为一维

let arr = [[0, 1], [2, 3], [4,[5,6,7]]]

const newArr = function(arr){
   return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur) ? newArr(cur) : cur),[])
}

console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]

对象里的属性求和

var result = [
    {
        subject: 'math',
        score: 10
    },
    {
        subject: 'chinese',
        score: 20
    },
    {
        subject: 'english',
        score: 30
    }
];

var sum = result.reduce(function(prev, cur) {
    return cur.score + prev;
}, 0);

console.log(sum) //60
es5中新增了5个迭代方法

forEach() 遍历数组

作用:遍历数组
参数:回到函数,arr.forEach(callback(currentValue [, index [, array]]))
返回值:无(undefined)
是否影响原数组:不影响

let arr=[5,54,12,4,1,23,111];
arr.forEach(function (value,index,array) {
    console.log(value);
    console.log(index);
    console.log(array);
});

JavaScript 索引、关联、对象数组增删改查循环_迭代_32
forEach() 方法遍历 非连续数组

let arr=[];
	arr[1]='a';
	arr[5]='g';
	arr[10]='h';
	arr.forEach(function (value,index) {
	    console.log(index);
	    console.log(value);
	});

JavaScript 索引、关联、对象数组增删改查循环_迭代_33

map 方法遍历加工数组

let arr=[5,54,12,4,1,23,111];
let new_arr=arr.map(function (value,index,array) {
    // console.log(value);
    // console.log(index);
    // console.log(array);
    return value+1000;
});

console.log(arr);
console.log(new_arr);

JavaScript 索引、关联、对象数组增删改查循环_其他_34

filter 方法遍历过滤数组

let arr=[5,54,12,4,1,23,111];
let new_arr=arr.filter(function (value,index,array) {
    return value>10;
});

console.log(arr);
console.log(new_arr);

JavaScript 索引、关联、对象数组增删改查循环_其他_35

some 方法检测数组中是否有元素(some)满足条件

let arr=[5,54,12,4,1,23,111];
let bool_val=arr.some(function (value,index,array) {
    return value>10;
});

console.log(arr);
console.log(bool_val);

JavaScript 索引、关联、对象数组增删改查循环_回调函数_36

every 方法检测数组中是否所有(every)元素满足条件

let arr=[5,54,12,4,1,23,111];
let bool_val=arr.every(function (value,index,array) {
    //return value>10;
    return value<1000;
});

console.log(arr);
console.log(bool_val);

JavaScript 索引、关联、对象数组增删改查循环_JavaScript_37

splice 修改数组,既删除,又添加

作用:从数组中删除元素、插入元素、或者同时完成这两种操作.

参数:
必带参数start​(指定修改的开始位置,可负数),可选参数 deleteCount,可选参数 item1, item2,…(表示要添加的元素)

返回值:被删除的元素组成的数组
是否影响原数组:肯定影响

let arr=[1,2,3,4,5];
let delete_arr=arr.splice(1,2,7,8);//在第1号位置删除两个,然后添加7和8

console.log(delete_arr);// [2, 3]
console.log(arr);// [1, 7, 8, 4, 5]

JavaScript 索引、关联、对象数组增删改查循环_其他_38
1、splice从数组中删除元素

let arr=[1,2,3,4,5];
let delete_arr=arr.splice(1,2);//从1号位置删2个

console.log(delete_arr);// [2, 3]
console.log(arr);// [1, 4, 5]

JavaScript 索引、关联、对象数组增删改查循环_数组_39
start 为负数,负数表示从倒数的第几个开始

let arr=[1,2,3,4,5];
let delete_arr=arr.splice(-3,2);//从1号位置删2个

console.log(delete_arr);// [3, 4]
console.log(arr);// [1, 2, 5]

let arr=[1,2,3,4,5];
let delete_arr=arr.splice(-2,0,7,8);//在倒数第二个位置添加7和8

console.log(delete_arr);// []
console.log(arr);// [1, 2, 3, 7, 8, 4, 5]

splice向数组中添加元素

let arr=[1,2,3,4,5];
let delete_arr=arr.splice(0,0,7,8);//在第 0 号位置添加7和 8

console.log(delete_arr);// []
console.log(arr);// [7, 8, 1, 2, 3, 4, 5]

删除数据的个数和添加数组的个数不一样

let arr=[1,2,3,4,5];
let delete_arr=arr.splice(1,1,7,8,9);//在第1号位置删除1个,然后添加7和8和9

console.log(delete_arr);// [2]
console.log(arr);// [1, 7, 8, 9, 3, 4, 5]

concat 将值或者数组拼接成新数组

concat 方法的作用是将值或者数组拼接成新数组,参数是0到n个值或数组,返回值是合并好的新数组,并且不会影响原数组。

作用:将值或者数组拼接成新数组
参数:值或者数组(0个到n个)
返回值:返回合并好的新数组
是否影响原数组:不会改变原数组

1、concat 拼接数组或者值

let arr1=[1,2,3];
let val1=6;
let arr2=[7,8,9];
let val2=11;

//参数为值形式
let new_arr1=arr1.concat(val1);
console.log(new_arr1);

JavaScript 索引、关联、对象数组增删改查循环_回调函数_40

let arr1=[1,2,3];
let val1=6;
let arr2=[7,8,9];
let val2=11;

// //参数为数组形式
let new_arr2=arr1.concat(arr2);
console.log(new_arr2);

JavaScript 索引、关联、对象数组增删改查循环_迭代_41

let arr1=[1,2,3];
let val1=6;
let arr2=[7,8,9];
let val2=11;

let new_arr3=arr1.concat(val1,arr2,val2);
console.log(new_arr3);

JavaScript 索引、关联、对象数组增删改查循环_其他_42

2、concat 做数组的深度拷贝

浅度拷贝:
复制一层对象的属性,并不包括对象里面的为引用类型的数据,当改变拷贝的对象里面的引用类型时,源对象也会改变。

深度拷贝:
重新开辟一个内存空间,需要递归拷贝对象里的引用,直到子属性都为基本类型。两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。

浅拷贝

let arr1=[1,2,3];
let arr2=arr1; //浅拷贝
arr2.unshift(4,5,6);

console.log(arr2);
console.log(arr1);

JavaScript 索引、关联、对象数组增删改查循环_数组_43
深拷贝

let arr1=[1,2,3];
let arr2=arr1.concat();//深拷贝
arr2.unshift(4,5,6);

console.log(arr2);
console.log(arr1);

JavaScript 索引、关联、对象数组增删改查循环_迭代_44
concat 做深度拷贝的不足

当数组内部的值是引用类型例如 Array、Object 时,还是浅拷贝。

let arr1=[1,2,3,{name:'悟空',age:13}];
let arr2=arr1.concat();//深拷贝
arr2.push(4,5,6);

console.log(arr2);
console.log(arr1);

arr2[3]['name']='悟净';
console.log(arr2);
console.log(arr1);

JavaScript 索引、关联、对象数组增删改查循环_JavaScript_45

join 将一个数组(或一个类数组对象)的所有元素连接成一个字符串

join 方法的作用是将一个数组(或一个类数组对象)的所有元素连接成一个字符串,参数是分割字符,返回值是连接号的字符串,不影响原数组。

作用:将一个数组(或一个类数组对象)的所有元素连接成一个字符串
参数:连接数值的分割参数,如果参数为空则是用,(逗号)连接
返回值:连接好的字符串
是否影响原数组:不影响

let arr=[1,2,3];
let arr_str=arr.join("-");
console.log(arr_str);

JavaScript 索引、关联、对象数组增删改查循环_JavaScript_46

let arr=[1,2,3];
let arr_str=arr.join();

console.log(arr);
console.log(arr_str);
console.log(typeof arr_str);

JavaScript 索引、关联、对象数组增删改查循环_JavaScript_47

let arr=[1,2,3];

//短线
let arr_str=arr.join("-");
console.log(arr_str);
let arr=[1,2,3];

//空字符串
let arr_str=arr.join("");
console.log(arr_str);

连接类数组对象

function f(a, b, c) {
    var s = Array.prototype.join.call(arguments);
    console.log(s); // '1,a,true'
    console.log(typeof s);
}
f(1, 'a', true);

JavaScript 索引、关联、对象数组增删改查循环_迭代_48

const 声明常量的本质

1、const 实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。

2、但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const 只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。

const foo = {};

// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123

// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only

上面代码中,常量 foo 储存的是一个地址,这个地址指向一个对象。

不可变的只是这个地址,即不能把 foo 指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。

下面是另一个例子。

const a = [];
a.push('Hello'); // 可执行
a.length = 0;    // 可执行
a = ['Dave'];    // 报错

上面代码中,常量 a 是一个数组,这个数组本身是可写的,但是如果将另一个数组赋值给a,就会报错。

如果真的想将对象冻结,应该使用 Object.freeze 方法。

const foo = Object.freeze({});

// 常规模式时,下面一行不起作用;
// 严格模式时,该行会报错
foo.prop = 123;

上面代码中,常量 foo 指向一个冻结的对象,所以添加新属性不起作用,严格模式时还会报错。

除了将对象本身冻结,对象的属性也应该冻结。

下面是一个将对象彻底冻结的函数。

var constantize = (obj) => {
  Object.freeze(obj);
  Object.keys(obj).forEach( (key, i) => {
    if ( typeof obj[key] === 'object' ) {
      constantize( obj[key] );
    }
  });
};

JSON.stringify() 和 JSON.parse()

JSON.stringify() 的作用是将 JavaScript 对象转换为 JSON 字符串,而 JSON.parse() 可以将JSON字符串转为一个对象。

localStorage/sessionStorage 默认只能存储字符串,而实际开发中,我们往往需要存储的数据多为对象类型,那么这里我们就可以在存储时利用 json.stringify() 将对象转为字符串,而在取缓存时,只需配合 json.parse() 转回对象即可。

let arr = [1,2,3];
JSON.stringify(arr);//'[1,2,3]'
typeof JSON.stringify(arr);//string

let string = '[1,2,3]';
console.log(JSON.parse(string))//[1,2,3]
console.log(typeof JSON.parse(string))//object

在使用 JSON.parse() 需要注意一点,由于此方法是将JSON字符串转换成对象,所以你的字符串必须符合JSON格式,即键值都必须使用双引号包裹:

let a = '["1","2"]';
let b = "['1','2']";
console.log(JSON.parse(a));// Array [1,2]
console.log(JSON.parse(b));// 报错

JavaScript 索引、关联、对象数组增删改查循环_其他_49
上面例子中变量b就无法转换,因为格式不符合。

1、判断数组是否包含某对象,或者判断对象是否相等

//判断数组是否包含某对象
let data = [
	    {name:'echo'},
	    {name:'听风是风'},
	    {name:'天子笑'},
    ],
    val = {name:'天子笑'};
    
JSON.stringify(data).indexOf(JSON.stringify(val)) !== -1;//true

//判断两数组/对象是否相等
let a = [1,2,3],
    b = [1,2,3];
JSON.stringify(a) === JSON.stringify(b);//true

2、localStorage/sessionStorage可以存储对象

localStorage/sessionStorage 默认只能存储字符串,而实际开发中,我们往往需要存储的数据多为对象类型,那么这里我们就可以在存储时利用 json.stringify() 将对象转为字符串,而在取缓存时,只需配合 json.parse() 转回对象即可。

//存
function setLocalStorage(key,val){
    window.localStorage.setItem(key,JSON.stringify(val));
};

setLocalStorage('demo',[1,55,3]);

JavaScript 索引、关联、对象数组增删改查循环_数组_50

//取
function getLocalStorage(key){
    let val = JSON.parse(window.localStorage.getItem(key));
    return val;
};

let  a = getLocalStorage('demo');//[1,2,3]

数组遍历的练习

var arr=[
    {name:'贾宝玉',score:58},
    {name:'林黛玉',score:98},
    {name:'薛宝钗',score:90},
    {name:'贾环',score:45},
    {name:'贾政',score:88},
    {name:'袭人',score:59}
];

function getPeople(arr) {
    var new_arr=[];

    //操作:将arr数组中得分不及格的对象提取出来,添加到new_arr数组中
    //1、遍历arr数组
    //i 是index
    for (var i=0;i<arr.length;i++){
        //2、将得分不及格的对象找出来
        if(arr[i].score<60){
            //3、将这个对象添加到new_arr数组中
            new_arr.push(arr[i]);
        }
    }
    return new_arr;
}

console.log(getPeople(arr));

JavaScript 索引、关联、对象数组增删改查循环_数组_51

var arr=['猪八戒','白骨精','嫦娥','孙悟空','小白龙'];
//console.log(arr[0]);

//用循环来实现数组的遍历
for(var i=0;i<arr.length;i++){
    console.log(arr[i]);
}

JavaScript 索引、关联、对象数组增删改查循环_数组_52

var arr=[[1,2,3],[4,5,6]];
arr[2]=[7,8,9];

console.log(arr);
console.log(arr[0]);
console.log(arr[0][1]);
console.log(arr[1][0]);

JavaScript 索引、关联、对象数组增删改查循环_回调函数_53

对象的小实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>对象的小实例</title>
</head>
<body>
<!--
大雄,学号001,性别男,语文成绩30分,数学成绩30分
静香,学号002,性别女,语文成绩90分,数学成绩90分
哆啦A梦,学号003,性别男,语文成绩100分,数学成绩80分
...

表示上述结构,并求出谁的语文成绩最好
-->
<script>
    var daXiong={
        name:'大雄',
        gender:'男',
        number:'001',
        score:{
            chinese:30,
            math:30
        }
    };
    var jingXiang={
        name:'静香',
        gender:'女',
        number:'002',
        score:{
            chinese:90,
            math:90
        }
    };
    var aMeng={
        name:'哆啦A梦',
        gender:'男',
        number:'003',
        score:{
            chinese:100,
            math:80
        }
    };
    if(daXiong.score.chinese>=jingXiang.score.chinese){
        //说明大雄的语文成绩比较好,就让大雄和哆啦A梦比
        if(daXiong.score.chinese>=aMeng.score.chinese){
            console.log(daXiong);
        }else{
            console.log(aMeng);
        }
    }else{
        //说明静香的语文成绩比较好,就让静香和哆啦A梦比
        if(jingXiang.score.chinese>=aMeng.score.chinese){
            console.log(jingXiang);
        }else{
            console.log(aMeng);
        }
    }
</script>
</body>
</html>

JavaScript 索引、关联、对象数组增删改查循环_其他_54

对象 json 写法

var zhubajie={
    'name':'猪八戒',
    age:999,
    pet:{
        name:'哮天犬',
        age:18
    }
};
console.log(zhubajie);

JavaScript 索引、关联、对象数组增删改查循环_迭代_55

for 杨辉三角

for(var i=0;i<5;i++){
    //内层循环是控制每一行*号的个数
    for(var j=0;j<i+1;j++){
        document.write('*');
    }
    document.write('<br>');
    // document.write('*****<br>');
}

JavaScript 索引、关联、对象数组增删改查循环_迭代_56

查找数组元素位置

indexOf() 方法的作用是在数组中找到给定元素最开始出现的位置,
lastIndexOf() 方法是找到给定元素最后出现的位置,
参数有必带的 searchElement(要查找的元素),
可选的fromIndex(要查找的位置),返回值是找到的索引位置,没找到就返回 -1。

indexOf() 方法查找元素在数组中出现的第一个位置

作用:在数组中找到一个给定元素的第一个索引
参数:必选参数searchElement(要查找的元素),可选参数fromIndex(要查找的位置)
返回值:首个被找到的元素在数组中的索引位置; 若没有找到则返回 -1
是否影响原数组:不影响

let arr=[2,4,5,7,6,4,3];
let index=arr.indexOf(4);
console.log(index);//1

指定第二个参数 fromIndex(开始查找的位置)

let arr=[2,4,5,7,6,4,3];
let index=arr.indexOf(4,2);
console.log(index);//5

indexOf() 方法找出指定元素出现的所有位置

var indices = [];
var array = ['a', 'b', 'a', 'c', 'a', 'd'];
var element = 'a';
var idx = array.indexOf(element);

while (idx != -1) {
    indices.push(idx);
    idx = array.indexOf(element, idx + 1);
}

console.log(indices);
// [0, 2, 4]

lastIndexOf() 方法找到指定元素在数组中的最后一个的索引

let arr=[2,4,5,7,6,4,3];
let index=arr.lastIndexOf(4);
console.log(index);//5
NaN的相等性判断

NaN和任何数都不相等,包括他本身,如果想判断一个数是否为NaN,可以用 isNaN() 函数。

/*
* NaN和任何数都不相等,包括它本身
* isNaN()函数专门用来判断一个数是不是NaN
*/
var a=NaN;
var b=NaN;
var ans=a==b;

console.log('ans='+ans);
console.log(isNaN(a));
console.log(isNaN(b));
console.log(isNaN('hello'));
console.log(+'hello');

JavaScript 索引、关联、对象数组增删改查循环_回调函数_57

如何使用unicode编码

在js中用 \u 四位编码使用,在html中用 &# 编码; 使用。

\u四位编码:
比如 console.log("\u2620");

&#编码; 
这里的编码需要的是10进制:比如 <h1 style="font-size: 200px;">&#9760;</h1>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>如何使用unicode编码</title>
    <script>
        console.log('\u4EFA');
        console.log('\u2665');
    </script>
</head>
<body>
<!--
在js 中使用unicode编码
console.log('\u4EFA');

在html中使用unicode编码
必须是10进制,
<span >♥</span>

-->
<span style="font-size: 100px;">仺</span>
<span style="font-size: 100px;">♥</span>

</body>
</html>

JavaScript 索引、关联、对象数组增删改查循环_回调函数_58

标签:arr,console,log,JavaScript,改查,var,let,数组,增删
From: https://blog.51cto.com/u_13571520/6046081

相关文章

  • JavaScript 运算符数据类型
    阅读目录运算符1、自增运算符2、分别赋值3、求多次方4、js中逻辑运算符数据类型1、数据类型2、强制类型转换运算符1、自增运算符leta=11;aler......
  • JavaScript undefined 与 null 的区别
    阅读目录阐述一、相似性二、历史原因三、最初设计四、目前的用法null表示"没有对象",即该处不应该有值。典型用法是:undefined表示"缺少值",就是此处应该有一......
  • JavaScript 评测代码运行速度
    一、使用performance.now()API在JavaScript中,可以使用performance.now()API来评测代码的运行速度。该API返回当前页面的高精度时间戳,您可以在代码执行前后调用它......
  • JavaScript类
    一、什么是js类类是创建对象的模板,使用class关键字,类体在大括号{}中,类体中我们可以写需要的属性、方法成员,其中每个类都包含一个特殊方法constructor()。它是类的构造函......
  • Avalonia中使用EF增删改查DM数据库
    达梦客户端下载地址选择X86平台#下载文件dm8_20220714_x86_win_64_ent.zipdocker方式安装数据库服务dm-docker安装大小写问题#下载文件dm8_20220822_rev166351_......
  • 从JavaScript到TypeScript,Flow与WebAssembly
    1、TypeScriptTypeScript是一种由微软开发的自由和开源的编程语言,它是JavaScript的一个超集,扩展了JavaScript的语法,主要提供了型别系统和对ES6的支持。TypeScript......
  • Web前端框架(JavaScript,CSS)、html组件、CSS规范与第三方库
    1、什么是前端框架前端框架一般指用于简化网页设计的框架,使用广泛的前端开发套件,比如,jquery,extjs,bootstrap等等,这些框架封装了一些功能,比如html文档操作,漂亮的各种控件(按钮,......
  • 【大前端】使用html/css/javascript开发移动端(安卓,IOS)与桌面端(Win,mac,Linux)应用程序
    1、什么是大前端?传统上,Web应用可分为前端(在浏览器中执行的部分)和后端(在服务器中执行的部分)。前端工程师的职责是以Web技术(HTML、CSS、JavaScript、DOM、Ajax等)实现基于浏览......
  • 逗号(,)运算符在Javascript中
    逗号运算符逗号运算符是二元运算符,它能够先执行运算符左侧的操作数,然后再执行右侧的操作数,最后返回右侧操作数的值。逗号表达式:一般形式:表达式1,表达式2,......
  • javaScript进阶
    javaScript进阶一、作用域JS的作用域简单来说就是变量(变量作用于又称上下文)和函数生效(能被访问)的区域1.全局作用域函数之外声明的变量,会成为全局变量。变量在程序的任......