问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用js遍历一个数组,在body生成三个元素和一个提交按钮,可以让用户填写温度提交?

发布网友 发布时间:2022-05-15 09:34

我来回答

2个回答

懂视网 时间:2022-05-15 13:55

js中有很多可以遍历数组的API,既然已经封装的这么好,为什么不在平常开发的时候使用,本文讲讲forEach、map、filter、some、every、reduce这些API的使用,并且和普通的for语句作对比。本文主要和大家分享js使用可遍历数组的API实例分享,希望能帮助到大家。

我们以一个对象数组作为测试数据:

const testArr = [
 { id: 1, name: '张三', age: 18 }, 
 { id: 2, name: '李四', age: 24 }, 
 { id: 3, name: '王小二', age: 22 }
];

forEach

打印出所有对象的id,for语句写法如下:

for (let i = 0, len = testArr.length; i < len; i++) {
 console.log(testArr[i].id); // 1, 2, 3
}

简单易懂,接下来看看forEach的写法:

testArr.forEach(item => console.log(item.id)); // 1, 2, 3

两者结果是一样的,for语句是命令式编程风格,而forEach是声明式编程风格;前者会告诉机器该如何做,而后者只关注要做什么。我们推崇后一种写法,应该尽量使用forEach,这样我们还不需要写for()里面一大串的表达式,何乐而不为。(ps:如果对性能吹毛求疵的话,还是老老实实用for吧!)

map

现在我们想得到所有对象的name并组成新的数组,for语句写法如下:

let names = [];

for (let i = 0, len = testArr.length; i < len; i++) {
 names.push(testArr[i].name);
}

console.log(names); // [ '张三', '李四', '王小二' ]

比较啰嗦,这种对原数组每个元素进行指定操作并最后返回新数组的问题用map再合适不过了:

testArr.map(item => item.name); // [ '张三', '李四', '王小二' ]

对比for语句,map是多么优雅啊!

关于map,有个需要注意的点:

[1, 2, 3].map(parseInt); // [ 1, NaN, NaN ]

这里有些同学会有些疑惑,为什么结果不是[1, 2, 3]呢?

其实很简单,map会将三个参数(当前正在遍历的元素,当前元素索引,原数组本身)传给parseInt,而parseInt是可以有两个参数的。

这时候就相当于执行以下代码:

parseInt(1, 0); // 1
parseInt(2, 1); // NaN
parseInt(3, 2); // NaN

所以结果为[1, NaN, NaN],而不是[1, 2, 3]。

filter

有时候我们需要筛选出符合指定条件的元素,比如age大于18的对象,for的写法如下:

let newArr = [];

for (let i = 0, len = testArr.length; i < len; i++) {
 if (testArr[i].age > 18) {
 newArr.push(testArr[i]);
 }
}

console.log(newArr); // [ { id: 2, name: '李四', age: 24 }, { id: 3, name: '王小二', age: 22 } ]

可以看到,写法很啰嗦,此时用filter的话就很方便了:

testArr.filter(item => item.age > 18); // [ { id: 2, name: '李四', age: 24 }, { id: 3, name: '王小二', age: 22 } ]

filter还可以用于数组去重,代码如下:

const arr2 = [1, 2, 4, 1, 3, 2, 6];

arr2.filter((item, idx, arr) => {
 return arr.indexOf(item) === idx;
}); // [ 1, 2, 4, 3, 6 ]

map + filter

获取所有对象的某种属性,事先需要判断对象是否具有该属性,for写起来有点丑陋:

function getAllOfSomeProps (array, props) {
 let arr = [];

 array.forEach((item) => {  
 if (item[props]) {
  arr.push(item[props]); // => item[props] && arr.push(item[props])
 }
 })

 return arr;
}

getAllOfSomeProps(testArr, 'sex'); // []
getAllOfSomeProps(testArr, 'id'); // [ 1, 2, 3 ]
getAllOfSomeProps(testArr, 'name'); // [ '张三', '李四', '王小二' ]

map + filter的组合就优雅的多了:

return array.map(item => item[props]).filter(item => item);

我们再举个比较通俗的例子,比如我们需要获得数组里所有age大于18的对象的name,for语句如下:

let newNames = [];

for (let i = 0, len = testArr.length; i < len; i++) {
 if (testArr[i].age > 18) {
 newNames.push(testArr[i].name);
 }
}

console.log(newNames); // [ '李四', '王小二' ]

再看看 map + filter 的写法:

testArr.filter(item => item.age > 18).map(item => item.name); // [ '李四', '王小二' ]

还是很优雅。

some

有时候我们需要添加新对象但是某些属性不能重复,for的写法如下:

function isRepeat (array, props, value) {
 for (let i = 0, len = array.length; i < len; i++) {
 if (array[i][props] === value) {
  return true;
 }
 }

 return false;
}

some方法测试数组中的某些元素是否通过指定函数的测试,改写如下:

function isRepeat (array, props, value) {
 return array.some(item => item[props] === value);
}

isRepeat(testArr, 'name', '张三'); // true
isRepeat(testArr, 'name', '李白'); // false

every

我们需要检测某个数组里的每个对象是否都具有某种属性,for的写法如下:

function hasSomeProps (array, props) {
 for (let i = 0, len = array.length; i < len; i++) {
 if (!array[i][props]) {
  return false;
 }
 }

 return true;
}

every方法测试数组的所有元素是否都通过了指定函数的测试。改写如下:

function hasSomeProps (array, props) {
 return array.every(item => item[props]);
}

hasSomeProps(testArr, 'name'); // true

跳出循环

有时需要在满足某条件下终止循环,比如打印对象信息,直到name为李四:

for使用break:

for (let i = 0, len = testArr.length; i < len; i++) {
 if (testArr[i].name === '李四') {
 break;
 }
 console.log(testArr[i]); // { id: 1, name: '张三', age: 18 }
}

some,当条件为真时返回true跳出循环:

testArr.some((item) => {
 if (item.name === '李四') {
 return true;
 }
 console.log(item); // { id: 1, name: '张三', age: 18 }
})

every,当条件为真时返回false跳出循环:

testArr.every((item) => {
 if (item.name === '李四') {
 return false;
 }
 console.log(item); // { id: 1, name: '张三', age: 18 }
})

因为forEach是没有break的,这里我们可以使用some,every替代。

reduce

计算[343, 34, 232, 4, 343, 335, 353535]的总和,for的写法如下:

const arr = [343, 34, 232, 4, 343, 335, 353535];

let sum = 0;
for (let i = 0, len = arr.length; i < len; i++) {
 sum += arr[i];
}
console.log(sum); // 354826

使用reduce来做这种累加操作很方便:

arr.reduce((prev, curr) => prev + curr) // 354826

其实用法远不止如此,同学们在平常学习或者工作中可以慢慢积累。

总结:遍历数组的时候应该尽量使用这些API,灵活运用可以让代码更加优雅,这种尽可能使用函数和链式调用的风格很接近函数式编程,可以提高代码质量。

热心网友 时间:2022-05-15 11:03

1:遍历后获取你要追加到哪个标签的后面或者前面 可以用jquery方法获取 $(选择器)
2:append方法追加你要添加的元素 input框 可以填写温度 提交按钮就设置type属性就可以了追问有没有具体代码什么的样子看一下,刚刚学,不是很了解

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 养宠物的人遵守规则,是不是就能和别人平安相处呢? 互联网是如何迈向商业化? 互联网在商业领域的衍生物 在现在的商业活动中如何将互联网思维与移动互联网思维有机结合_百度问一问 请问各位高手有没有能把caj格式转换成pdf的简单有效的方法? 怎么登录QQ炫舞 如何登录QQ炫舞游戏界面 掌上炫舞苹果怎么登录? 一段精准表达要一语过三关指哪三关 可以帮助提高写作的书 求《精准表达:开口就能说重点》全文免费下载百度网盘资源,谢谢~ 《精准表达:开口就能说重点》pdf下载在线阅读,求百度网盘云资源 《精准表达:开口就能说重点》pdf下载在线阅读全文,求百度网盘云资源 《精准表达让你的方案在最短的时间内打动人心》epub下载在线阅读全文,求百度网盘云资源 《精准表达》pdf下载在线阅读全文,求百度网盘云资源 长期带口罩会血液缺氧吗 怎样使word中每页的长度相等? 躺着玩手机起来感觉头晕是什么情况 垫高枕头长时间一直半躺着,压着后脑和脊椎玩手机后头晕想吐怎么办? 床上看手机 坐着看电脑时间长了 头晕 恶心 躺着玩手机久了偏头痛得厉害怎么办 考研的时候每科都发草稿纸吗, 杭州的考点考研数学的时候,草稿纸的数量是否限制? 考研数学草稿纸给几张? 考研数学用草稿纸有限制吗 宝宝九个月,买什么保险好 我宝宝9个月,想给他买一份保险,我想问问什么保险会比较为 9个月宝宝能买农村合作医疗保险吗,怎么买 9个月大的宝宝买什么保险最好 教育金,我女儿九个月,阳光金娃娃保险怎么样 母亲是城镇户父亲是农村户九个月的宝宝住院了可不可以用父亲的农村医保报销 有哪些电视或电影是在开平,台山取景? 电影《让子弹飞》的拍摄地是哪里? 开平市拍过什么电影 还记得当年的电影让子弹飞吗?自驾探寻拍摄地,原来真的有这么美 王家卫电影一代宗师现在哪里拍摄呢? 百事巨星天团热力兄弟加盟一代宗师与宋慧乔梁朝伟章子怡一起演戏,在那里拍的! 有人讲章子怡在广东省江门市开平正在拍叶问前传之大师在雕楼是不是真的啊? 在开平碉楼拍过什么电影 求开平赤坎影视城的资料 王家卫《一代宗师》电影章子怡,梁朝伟,宋慧乔,赵晨浩,热力兄弟入组时间?