1. 程式人生 > 實用技巧 >js map 實戰

js map 實戰

需求:後端需要一個數組,裡面的結構是

let arr = [{"url":'http://www.xxx.com',"test_id": 1001}]

習慣了for of一把梭的我,想試試用map來實現這個需求。
進行測試驗證:

var users = [
  {name: "張含韻", "email": "[email protected]"},
  {name: "江一燕",   "email": "[email protected]"},
  {name: "李小璐",  "email": "[email protected]"}
];

var emails = users.map(function (user) { return user.email; });

// 輸出emails :["[email protected]", "[email protected]", "[email protected]"]
image.png

說來慚愧,對於map這個內建函式,總沒掌握它的精髓,知道它可以做迴圈,也知道可以拿來去重,但總是用不靈活。
(map方法的作用不難理解,“對映”嘛,也就是原陣列被“對映”成對應新陣列。)
接著上面的問題我們繼續:

var users = [
  {name: "張含韻", "email": "[email protected]"},
  {name: "江一燕",   "email": "[email protected]"},
  {name: "李小璐",  "email": "[email protected]"}
];

var emails = users.map(function (user) {user.age = 12; ruturn user });

// 輸出 users :
// 輸出 emails :
image.png

發現原來的陣列被改變了,這個是什麼原因呢?

群友A解答道: user本身也是物件,會有記憶體指向,直接賦值屬性會改變原來的物件

那下一步是考慮怎麼才能不影響原陣列?

這裡群友給了幾種解決思路:

1. 也可以先 JSON.parse(JSON.stringify(user))處理,也可以clone後再處理

2. users.map((user) => ({ ...user, value: 123 })) // 這裡用瞭解構的語法

3.反正都是用map,內部就是怎麼處理物件用到同個記憶體的問題

4.有空多去翻下 MDN

5.喜歡短的嗎 this.newObj.images && this.newObj.images.map(func)

這個地方,加解構和不加解構有什麼區別呢?

// 加了不改變原陣列,陣列內的物件是個新物件了,不加就是在原物件上更改(原陣列會變)
users.map((user) => ({ ...user, value: 123 })) // 這裡用瞭解構的語法

感謝群友提供的圖:

定義數組裡面有物件,理論上是開闢了多個記憶體空間,每個物件(含陣列)都有各自的指向記憶體空間
image.png

寫在最後,很多東西總覺得會了,其實實際的操作中會遇到很多細節問題。

結論就是多思考,多實操,多去翻下 MDN