javascript
数组的迭代数组里面每个对象添加属性值_JS数组和对象循环遍历的几种实现方式...
數組遍歷
1. 普通for循環
let arr = [1,2,3,4,5] for (let i = 0; i < arr.length; i++) {console.log(arr[i]) } // 輸出結果 // 1 // 2 // 3 // 4 // 52. 優化普通for循環
let arr = [1,2,3,4,5] for(var j = 0,len = arr.length; j < len; j++){console.log(arr[j]); }3. forEach循環 (箭頭函數改變this指向 手寫forEach)
forEach() 方法用于調用數組的每個元素,并將元素傳遞給回調函數。
注意: forEach() 對于空數組是不會執行回調函數的。
let arr = [1,2,3,4,5] let obj = {a:1,b:2} arr.forEach((currentValue, index, arr) => {console.log(currentValue,index,arr,this) }, obj) arr.forEach(function(currentValue, index, arr){console.log(currentValue,index,arr,this) }, obj)forEach() 的 continue 與 break
forEach() 本身是不支持的 continue 與 break 語句的,我們可以通過 some 和 every 來實現。
使用 return 語句實現 continue 關鍵字的效果:
4. map遍歷
map() 方法返回一個新數組,數組中的元素為原始數組元素調用函數處理后的值。
map() 方法按照原始數組元素順序依次處理元素。
注意: map() 不會對空數組進行檢測。
注意: map() 不會改變原始數組。
語法 array.map(function(currentValue,index,arr), thisValue) let arr = [1,2,3,4,5] let mapResult = arr.map((currentValue, index, arr)=>{console.log(currentValue,index,arr)return currentValue * index }) console.log(mapResult)1 0 (5) [1, 2, 3, 4, 5] 2 1 (5) [1, 2, 3, 4, 5] 3 2 (5) [1, 2, 3, 4, 5] 4 3 (5) [1, 2, 3, 4, 5] 5 4 (5) [1, 2, 3, 4, 5] (5) [0, 2, 6, 12, 20]forEach 和 map 的區別
forEach適合于你并不打算改變數據的時候,而只是想用數據做一些事情 – 比如存入數據庫或則打印出來。
map()適用于你要改變數據值的時候。不僅僅在于它更快,而且返回一個新的數組。這樣的優點在于你可以使用復合(composition)(map(), filter(), reduce()等組合使用)來玩出更多的花樣。
能用forEach()做到的,map()同樣可以。反過來也是如此。
map()會分配內存空間存儲新數組并返回,forEach()不會返回數據。
forEach()允許callback更改原始數組的元素。map()返回新的數組。
5. for... of
在可迭代對象(包括 Array,Map,Set,String,TypedArray,arguments 對象等等)上創建一個迭代循環,調用自定義迭代鉤子,并為每個不同屬性的值執行語句
let arr = [1,2,3,4,5] for (let num of arr){console.log(num) }對象遍歷
1. for...in (不適合數組)
for in 循環會遍歷原型鏈上的屬性
可以在for-in循環的時候添加 hasOwnProperty()方法來過濾掉非自有屬性
// 創建一個對象并指定其原型,bar 為原型上的屬性 const obj = Object.create({bar: 'bar' })// foo 為對象自身的屬性 obj.foo = 'foo'for (let key in obj) {console.log(obj[key]) // foo, bar }for (let key in obj) {if (obj.hasOwnProperty(key)) {console.log(obj[key]) // foo} }for...in 語句以任意順序迭代對象的可枚舉屬性。
2. Object.keys()
Object.keys() 返回一個數組,包括對象自身的(不含繼承的)所有可枚舉屬性(不含Symbol屬性).
for in 循環和 Object.keys()方法都不會返回對象的不可枚舉屬性。
Object.values()和 Object.entries()也都是返回一個給定對象自身可枚舉屬性的鍵值對數組。
Object.keys(obj).forEach((key) => {console.log(obj[key]) // foo })3. Object.getOwnPropertyNames()
Object.getOwnPropertyNames() 也是 ES5 新增的一個對象方法,該方法返回對象自身屬性名組成的數組,包括不可枚舉的屬性。
// 創建一個對象并指定其原型,bar 為原型上的屬性 // baz 為對象自身的屬性并且不可枚舉 const obj = Object.create({bar: 'bar' }, {baz: {value: 'baz',enumerable: false} })obj.foo = 'foo'// 不包括不可枚舉的 baz 屬性 Object.keys(obj).forEach((key) => {console.log(obj[key]) // foo })// 包括不可枚舉的 baz 屬性 Object.getOwnPropertyNames(obj).forEach((key) => {console.log(obj[key]) // baz, foo })4. Object.getOwnPropertySymbols()
Object.getOwnPropertySymbols()方法返回對象自身的 Symbol 屬性組成的數組,不包括字符串屬性
// 給對象添加一個不可枚舉的 Symbol 屬性 Object.defineProperties(obj, {[Symbol('baz')]: {value: 'Symbol baz',enumerable: false} })// 給對象添加一個可枚舉的 Symbol 屬性 obj[Symbol('foo')] = 'Symbol foo'Object.getOwnPropertySymbols(obj).forEach((key) => {console.log(obj[key]) // Symbol baz, Symbol foo })5. Reflect.ownKeys()
Reflect.ownKeys()方法是 ES2015 新增的靜態方法,該方法返回對象自身所有屬性名組成的數組,包括不可枚舉的屬性和 Symbol 屬性。
Reflect.ownKeys(obj).forEach((key) => {console.log(obj[key]) // baz, foo, Symbol baz, Symbol foo })五種方法對比
總結
以上是生活随笔為你收集整理的数组的迭代数组里面每个对象添加属性值_JS数组和对象循环遍历的几种实现方式...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql数据库密码为空_注意MySQL
- 下一篇: gradle idea java ssm