欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript中Array.map()的使用與技巧分享(附實際應用代碼)

 更新時間:2025年02月13日 10:14:06   作者:watermelo37  
Array.map()適合需要返回新數組、進行鏈式調用或不修改原數組的場景,它與forEach()的區(qū)別在于有返回值,基本語法中,callback函數處理每個元素并返回新值,本文介紹了JavaScript中Array.map()的使用與技巧分享(附實際應用代碼),需要的朋友可以參考下

一、什么時候該使用Array.map(),與forEach()的區(qū)別是什么?

1、什么時候該用Array.map()

一般滿足下列三種情況之一就可以使用Array.map()了:

  • 需要返回一個新數組,新數組的長度與原數組相同
  • 需要進行鏈式調用,方便進行多步數據轉換。
  • 需要修改數組且不修改原數組內容

2、Array.map()與Array.forEach()的區(qū)別

最大的區(qū)別就是Array.map()有返回值,Array.forEach()沒有返回值。以上三種情況也都是基于Array.map()有返回值所以才適用的。

二、Array.map()的使用與技巧

1、基本語法

array.map(callback(currentValue, index, array), thisArg)
  • callback:一個函數,用于處理每個元素,并返回處理后的值。
  • currentValue:正在處理的當前元素。
  • index(可選):正在處理的當前元素的索引。
  • array(可選):調用 map() 的數組。
  • thisArg(可選):執(zhí)行 callback 函數時,用作 this 的值。

2、返回值

返回一個新數組,結果為原始數組元素依次調用 callback 后的值(往往為一個新的數組)。

3、使用技巧

array.map()創(chuàng)建一個新數組,其結果是該數組中的每個元素(調用一個提供的函數)調用一個提供的函數后的返回值。這個方法對原數組不進行任何修改。

應用場景:數據轉換、創(chuàng)建派生數組、應用函數、鏈式調用、異步數據流處理、復雜API請求、DOM操作、搜索和過濾等。其中應用函數常作為map操作中的其中一步,更多指一種封裝和復用的思想而不是一種具體的需求。

三、Array.map()的應用領域與實際案例

1、數據轉換與應用函數

假設我們有一個電子商務網站的訂單數組,每個訂單是一個對象,包含 id、date、items 和 shipping。每個 items 是一個對象數組,包含 name、price 和 quantity。

我們的目標是創(chuàng)建一個新的數組,其中每個元素是一個對象,包含訂單的 id、訂單總金額(所有商品價格和數量的總和)、訂單日期以及基于總金額計算的稅費(稅費計算函數為 calculateTax(totalAmount),其中如果總金額小于1000,則稅費為總金額的10%,否則為100)。

// 創(chuàng)建一個新的數組,其中每個元素是一個對象,包含訂單的 id、訂單總金額、訂單日期以及基于總金額計算的稅費
// 其中如果總金額小于1000,則稅費為總金額的10%,否則為100
 
// 示例訂單數組
const orders = [
  { id: 1, date: '2023-04-01', items: [{ name: 'Item1', price: 100, quantity: 2 }], shipping: 50 },
  { id: 2, date: '2023-04-02', items: [{ name: 'Item2', price: 200, quantity: 1 }], shipping: 30 },
  // ... 更多訂單
];
 
// 稅費計算函數
function calculateTax(totalAmount) {
  return totalAmount < 1000 ? totalAmount * 0.1 : 100;
}
 
// 創(chuàng)建新數組,包含每個訂單的id, 總金額, 訂單日期和稅費
const orderDetails = orders.map(order => {
  const totalAmount = order.items.reduce((sum, item) => sum + item.price * item.quantity, 0);
  const tax = calculateTax(totalAmount);
  return {
    id: order.id,
    totalAmount: totalAmount + order.shipping + tax, // 包括運費和稅費的最終總金額
    date: order.date,
    tax: tax
  };
});
 
console.log(orderDetails);
 
 
// 輸出:
[
  {
    id: 1,
    totalAmount: 300, // 100 * 2 (items) + 50 (shipping) + 20 (tax)
    date: '2023-04-01',
    tax: 20
  },
  {
    id: 2,
    totalAmount: 330, // 200 * 1 (item) + 30 (shipping) + 30 (tax)
    date: '2023-04-02',
    tax: 30
  },
  // ... 更多訂單詳情
]

2、創(chuàng)建派生數組

要創(chuàng)建派生數組,相比于直接通過for循環(huán)來“以舊換新”,array.map()比for、foreach還有非常不常用的while、do...while高級,代碼清晰,可讀性強,代碼就看起來很優(yōu)雅,如果都是嵌套循環(huán)和嵌套回調,看起來就是一團亂麻,可讀性差,很不優(yōu)雅。

舉個例子:有一個員工信息的數組,每個員工對象包含 name、age 和 salary。我們想要創(chuàng)建一個新的數組,其中只包含年齡超過30歲的員工的姓名和工資。

// 有一個員工信息的數組,每個員工對象包含 name、age 和 salary。我們想要創(chuàng)建一個新的數組,其中只包含年齡超過30歲的員工的姓名和工資。
 
const employees = [
  { name: 'Alice', age: 25, salary: 70000 },
  { name: 'Bob', age: 32, salary: 80000 },
  { name: 'Charlie', age: 35, salary: 90000 },
  { name: 'David', age: 22, salary: 60000 }
];
 
const olderEmployees = employees
  .filter(employee => employee.age > 30) // 篩選年齡超過30歲的員工
  .map(employee => ({
    name: employee.name,
    salary: employee.salary
  })); // 創(chuàng)建新數組,只包含姓名和工資
 
console.log(olderEmployees);
 
// 輸出:
[
  { name: 'Bob', salary: 80000 },
  { name: 'Charlie', salary: 90000 }
]

3、鏈式調用

有一個用戶信息的數組,每個用戶對象包含 id、name 和 isActive。我們想要獲取所有活躍用戶的姓名,并按照字母順序排序。

//有一個用戶信息的數組,每個用戶對象包含 id、name 和 isActive。我們想要獲取所有活躍用戶的姓名,并按照字母順序排序
 
const users = [
  { id: 1, name: 'Alice', isActive: true },
  { id: 2, name: 'Bob', isActive: false },
  { id: 3, name: 'Charlie', isActive: true },
  { id: 4, name: 'David', isActive: true }
];
 
const activeUserNames = users
  .filter(user => user.isActive) // 篩選活躍用戶
  .map(user => user.name) // 獲取用戶名
  .sort(); // 按照字母順序排序
 
console.log(activeUserNames);
 
 
// 輸出:
// ['Alice', 'Charlie', 'David']

4、異步數據流處理

有一個用戶列表,每個用戶都有一個異步函數 fetchUserData 來獲取用戶的詳細信息。我們想要獲取所有用戶的詳細信息,并對結果進行處理。

// 有一個用戶列表,每個用戶都有一個異步函數 fetchUserData 來獲取用戶的詳細信息。我們想要獲取所有用戶的詳細信息,并對結果進行處理。
 
const users = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' },
  // ... 更多用戶
];
 
// 模擬異步獲取用戶詳細信息的函數
const fetchUserData = userId => 
  new Promise(resolve => setTimeout(() => resolve(`Data for user ${userId}`), 1000));
 
// 使用 map() 和 Promise.all() 處理異步數據流
const fetchAllUserData = users.map(user =>
  fetchUserData(user.id).then(data => ({ ...user, details: data }))
);
 
Promise.all(fetchAllUserData).then(usersWithData => {
  console.log(usersWithData); // 輸出處理后包含每個用戶詳細信息的數組
});

5、復雜API請求梳理

有時候需要從不同的API端點獲取數據,并將這些數據匯總到一個數組中。

// 需要從不同的API端點獲取數據,并將這些數據匯總到一個數組中。
 
const apiEndpoints = [
  'https://api.example.com/data1',
  'https://api.example.com/data2',
  // ... 更多API端點
];
 
// 模擬異步API請求
const fetchDataFromApi = url => 
  new Promise(resolve => setTimeout(() => resolve(`Data from ${url}`), 500));
 
// 使用 map() 來對每個API端點發(fā)起請求
const fetchAllData = apiEndpoints.map(endpoint =>
  fetchDataFromApi(endpoint)
);
 
Promise.all(fetchAllData).then(allData => {
  console.log(allData); // 輸出包含所有API請求結果的數組
});

6、提供DOM操作

假設我們有一個用戶列表,我們想要為每個用戶創(chuàng)建一個列表項并將其添加到頁面上的一個列表中。

// 假設我們有一個用戶列表,我們想要為每個用戶創(chuàng)建一個列表項并將其添加到頁面上的一個列表中。
 
const users = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' },
  // ... 更多用戶
];
 
// 選擇頁面上的列表元素
const userList = document.getElementById('user-list');
 
// 使用 map() 生成每個用戶的列表項
const listItems = users.map(user => {
  const li = document.createElement('li');
  li.textContent = `User ${user.name}`;
  return li;
});
 
// 將所有列表項添加到列表中
listItems.forEach(item => userList.appendChild(item));

7、用來搜索和過濾

假設我們有一個商品列表,我們想要根據用戶的搜索輸入來過濾商品。

// 假設我們有一個商品列表,我們想要根據用戶的搜索輸入來過濾商品。
 
const products = [
  { id: 1, name: 'Apple', category: 'Fruits' },
  { id: 2, name: 'Banana', category: 'Fruits' },
  // ... 更多商品
];
 
// 用戶輸入的搜索關鍵詞
const searchQuery = 'Apple';
 
// 使用 map() 和 filter() 進行搜索和過濾
const filteredProducts = products
  .filter(product => product.name.includes(searchQuery))
  .map(product => ({
    id: product.id,
    name: product.name,
    // 其他需要展示的信息
  }));
 
console.log(filteredProducts); // 輸出匹配搜索關鍵詞的商品列表

四、總結

array.map()可以用來數據轉換、創(chuàng)建派生數組、應用函數、鏈式調用、異步數據流處理、復雜API請求梳理、提供DOM操作、用來搜索和過濾等,比for好用太多了,主要是寫法簡單,并且非常直觀,并且能提升代碼的可讀性,也就提升了Long Term代碼的可維護性。

以上就是JavaScript中Array.map()的使用與技巧分享(附實際應用代碼)的詳細內容,更多關于JavaScript Array.map()用法的資料請關注腳本之家其它相關文章!

相關文章

最新評論