数组方法:
- forEach方法的第一个参数是一个函数,函数的第一个参数是元素,第二个参数才是索引号,与变量名没关系,顺序是固定的
- 不能写continue、break,return也不能终止循环,想要终止循环,可以用some方法
- filter方法,是用来过滤数组元素
- 接收一个函数作为参数,这个函数的第一个形参是元素,第二个形参是索引号
- 内部会有循环机制,每次循环都会调用函数,如果函数返回true,则保留当前循环元素,如果返回false,则剔除当前循环元素
- 会返回一个新数组,不会影响原来的数组,我们也称之为非变异方法
- some方法,是用来看数组中是否存在符合条件的元素(运行机制:内部也有循环机制,每次循环也会调用函数,只要函数返回true,则终止循环,some函数也返回true,若果循环结束,还没有一个返回true,则some函数返回false)
- 返回值是布尔值,如果有,则返回true,否则返回false
- 一旦找到符合条件的,则立即终止循环
- 当循环逻辑比较复杂或耗时时,可以提高一丢丢性能
- map方法,用来做映射,返回值是数组,内部会有循环机制…,实参函数的返回值会组成一个新的数组返回
- every方法,和some类似,但必须每一个都符合条件,才返回true,反之,只要有一个不符合条件,就返回false
非变异方法和变异方法的区别就是看调用完这个方法后,会不会影响原数组,有则是变异方法,无则是非变异方法
写代码时,要逐步测试,不要写了一百行,再来测试,如果报错了,这个时候你很可能懵逼,不知道到底是哪一行代码引起的
forEach和some的区别:
- forEach不可以通过return终止循环,也不可以使用continue、break
- some可以通过return true(why? 乌龟的尾巴,死龟腚)终止循环,在只需要找到某个元素时,效率更高
trim方法:
- .trim()方法就是去除字符串的前后空格,中间的不会去掉
var str = ' hello '
console.log(str.trim()) //hello 去除两端空格
var str1 = ' he l l o '
console.log(str.trim()) //he l l o 去除两端空格
Object.keys(obj):
- Object.keys(obj)返回obj对象自身(拿不到原型链上的属性)的所有键名组成的数组
var obj = {
id: 1,
pname: '小米',
price: 1999,
num: 2000
};
var result = Object.keys(obj)
console.log(result)//[id,pname,price,num]
1.1数组方法forEach遍历数组
arr.forEach(function(value, index, array) {
//参数一是:数组元素
//参数二是:数组元素的索引
//参数三是:当前的数组
})
//相当于数组遍历的 for循环 没有返回值
1.2数组方法filter过滤数组
var arr = [12, 66, 4, 88, 3, 7];
var newArr = arr.filter(function(value, index,array) {
//参数一是:数组元素
//参数二是:数组元素的索引
//参数三是:当前的数组
return value >= 20;
});
console.log(newArr);//[66,88] //返回值是一个新数组
1.3数组方法some
some 查找数组中是否有满足条件的元素
var arr = [10, 30, 4];
var flag = arr.some(function(value,index,array) {
//参数一是:数组元素
//参数二是:数组元素的索引
//参数三是:当前的数组
return value < 3;
});
console.log(flag);//false返回值是布尔值,只要查找到满足条件的一个元素就立马终止循环
1.4筛选商品案例
1. 定义数组对象数据
var data = [{
id: 1,
pname: '小米',
price: 3999
}, {
id: 2,
pname: 'oppo',
price: 999
}, {
id: 3,
pname: '荣耀',
price: 1299
}, {
id: 4,
pname: '华为',
price: 1999
}, ];
2. 使用forEach遍历数据并渲染到页面中
data.forEach(function(value) {
var tr = document.createElement('tr');
tr.innerHTML = '<td>' + value.id + '</td><td>' + value.pname + '</td><td>' + value.price + '</td>';
tbody.appendChild(tr);
});
3. 根据价格筛选数据
1. 获取到搜索按钮并为其绑定点击事件
search_price.addEventListener('click', function() {
});
2. 使用filter将用户输入的价格信息筛选出来
search_price.addEventListener('click', function() {
var newDate = data.filter(function(value) {
//start.value是开始区间
//end.value是结束的区间
return value.price >= start.value && value.price <= end.value;
});
console.log(newDate);
});
3. 将筛选出来的数据重新渲染到表格中
1. 将渲染数据的逻辑封装到一个函数中
function setDate(mydata) {
// 先清空原来tbody 里面的数据
tbody.innerHTML = '';
mydata.forEach(function(value) {
var tr = document.createElement('tr');
tr.innerHTML = '<td>' + value.id + '</td><td>' + value.pname + '</td><td>' + value.price + '</td>';
tbody.appendChild(tr);
});
}
2. 将筛选之后的数据重新渲染
search_price.addEventListener('click', function() {
var newDate = data.filter(function(value) {
return value.price >= start.value && value.price <= end.value;
});
console.log(newDate);
// 把筛选完之后的对象渲染到页面中
setDate(newDate);
});
4. 根据商品名称筛选
1. 获取用户输入的商品名称
2. 为查询按钮绑定点击事件,将输入的商品名称与这个数据进行筛选
search_pro.addEventListener('click', function() {
var arr = [];
data.some(function(value) {
if (value.pname === product.value) {
// console.log(value);
arr.push(value);
return true; // return 后面必须写true
}
});
// 把拿到的数据渲染到页面中
setDate(arr);
})
1.5some和forEach区别
- 如果查询数组中唯一的元素, 用some方法更合适,在some 里面 遇到 return true 就是终止遍历 迭代效率更高
- 在forEach 里面 return 不会终止迭代