JS数组映射方法:如何使用map转换数据结构

需积分: 16 0 下载量 75 浏览量 更新于2024-12-14 收藏 1KB ZIP 举报
资源摘要信息:"JavaScript中使用Array.prototype.map()方法处理数组数据" 在JavaScript编程中,数组(map)方法是一个非常常用和强大的函数,它允许对数组中的每个元素执行一个函数,并将结果组成一个新的数组返回。这在进行数据转换、过滤等操作时非常有用。在给出的文件标题中,`let newArrayData = arrayData.map(it)`这部分代码是一个非常典型的用法,它说明了如何使用map方法。 ### Array.prototype.map()方法简介 `map()`方法创建一个新数组,其结果是该数组中的每个元素是调用一次提供的函数后的返回值。map方法在处理数组数据时,能够按照提供的转换逻辑来处理数组中的每一个元素,并且不会修改原始数组。 ### map()方法的使用格式 ``` array.map(callback(currentValue[, index[, array]])[, thisArg]) ``` - `callback`: 用来对每个元素执行的函数,该函数接受三个参数: - `currentValue`: 当前正在数组中处理的元素。 - `index`(可选): 正在处理的元素在数组中的索引。 - `array`(可选): 调用map方法的数组。 - `thisArg`(可选): 执行`callback`时使用的`this`值。 ### 在给定标题中的代码分析 标题中的`js代码-let newArrayData = arrayData.map(it)`其实是一个不完整的代码片段。`arrayData.map(it)`部分是对一个名为`arrayData`的数组执行`map`方法,而`it`应该是一个回调函数的参数,代表数组中的当前元素。假设回调函数是一个简单的返回当前元素的函数,完整的代码应该是这样的: ```javascript let newArrayData = arrayData.map(function(it) { return it; }); ``` 或者使用箭头函数简化书写: ```javascript let newArrayData = arrayData.map(it => it); ``` 这两种写法都会返回一个新数组,其中包含与原数组`arrayData`相同的元素。 ### map()方法的应用场景 1. **转换数据**:当你想要从数组中的每个元素创建一个新形式的元素时,比如从对象数组中提取某个字段创建新数组。 2. **执行计算**:对数组中的每个元素应用某种算法或计算,然后获取计算后的结果数组。 3. **处理复杂对象数组**:如果数组中的每个元素都是一个复杂对象,你可能想要修改对象的某些属性值并返回一个新对象组成的数组。 ### map()方法的优点 - **不会修改原数组**:它不会改变原数组中的元素,而是返回一个全新的数组。 - **链式调用**:可以和其他数组方法如`filter()`, `sort()`, `reduce()`等链式调用,实现复杂的数据处理。 - **自定义函数逻辑**:你可以定义自己的函数来决定如何处理数组中的元素。 ### 注意事项 - 当数组中的元素是原始数据类型时,如数字或字符串,`map()`方法返回的数组中这些元素的值与原数组相同,没有被修改。 - 当数组中的元素是对象时,`map()`方法返回的新数组中的元素与原数组中相对应的元素引用相同(如果`callback`函数修改了元素对象,则会影响原数组)。 - `map()`方法的回调函数中不应该有副作用(side effects),以避免修改原数组元素的状态。 ### 结语 `map()`方法是处理数组元素的一种非常有用的工具,它提供了一种简洁且高效的方式来进行数组数据的转换。通过上述解释,我们了解到`map()`方法的基本用法、应用场景以及一些重要的使用注意事项。掌握这个方法,可以大大提高对数组数据处理的效率和能力。
2023-06-08 上传

function link_package(cmd, data) { let isCmd = cmd if (cmd == 1) { isCmd = 128 } console.log("isCmd:" + isCmd + " data:" + data) let totalData = []; var length = data.length; var data_len_20 = length / defaultByteLength; data_len_20 = Math.trunc(data_len_20); var data_len_0 = length % defaultByteLength; var i = 0; if (data_len_20 > 0) { for (; i < data_len_20; i++) { let perData = []; let tmpSeq = 0 if (cmd == 0) { tmpSeq = app.getLinkedSeq() } var cmdId = isCmd + tmpSeq % 128; console.log("cmdId1:" + cmdId + " seq1:" + tmpSeq); perData = perData.concat(cmdId) let da = data.slice(defaultByteLength * i, defaultByteLength * (i + 1)); perData = perData.concat(da) totalData = totalData.concat(header) totalData = totalData.concat(mergLinkHeadAndCrc(perData)); } } if (data_len_0 > 0) { var ed = data.slice( defaultByteLength * i, defaultByteLength * i + data_len_0 ); let perData = []; let tmpSeq = 0 if (cmd == 0) { tmpSeq = app.getLinkedSeq() } var cmdId = isCmd + tmpSeq % 128; console.log("cmdId2:" + cmdId + " seq2:" + tmpSeq); perData = perData.concat(cmdId) let emptyData = Array(defaultByteLength - data_len_0).fill(0xFF); perData = perData.concat(ed) perData = perData.concat(emptyData) totalData = totalData.concat(header) totalData = totalData.concat(mergLinkHeadAndCrc(perData)); } return totalData; } //组装最后的报文 function mergLinkHeadAndCrc(sendData) { let data = sendData.concat() let totalData = [] totalData = totalData.concat(data) var hexStrWithBank = utils.byteArrayToHex(totalData); var crcCalcu = parseCrc(hexStrWithBank); var crcByte = utils.HexStrToByte(crcCalcu); console_log.log( "data bank:" + utils.ByteArrayToHexBankStr(totalData) + "--carc:" + utils.byteArrayToHex(crcByte) ); var afterCrcBytes = []; afterCrcBytes = afterCrcBytes.concat(totalData); afterCrcBytes = afterCrcBytes.concat(crcByte); return afterCrcBytes; }请用class封装,并且将详细的代码告诉我

2023-07-09 上传

const processSaleOutBoundDetailArr = async (saleOutBoundArr, tokenData, accountData) => { let saleOutBoundDetailArr = [] if (saleOutBoundArr?.length > 0) { for (const item of saleOutBoundArr) { const saleOutBoundDetailRes = await getSaleOutBoundDetail( { id: item.id }, { "app-token": tokenData['app-token'], "X-GW-Router-Addr": accountData?.domain } ); if (saleOutBoundDetailRes.data.errcode === 0) { item.detailList = await processMaterial(item.id, saleOutBoundDetailRes.data.data.material_entity, tokenData, accountData) } saleOutBoundDetailArr.push(item) } } return saleOutBoundDetailArr } const processMaterial = async (orderId, materials, tokenData, accountData) => { let materialArr = [] if (materials && materials.length) { const materialIds = [...new Set(materials.map(item => item.material_id))]; const materialPromises = materialIds.map(id => { return getMaterialDetail({ id }, { "app-token": tokenData['app-token'], "X-GW-Router-Addr": accountData?.domain }); }); const materialDetails = await Promise.all(materialPromises); materialArr = materials.map(material => { const materialDetail = materialDetails.find(detail => detail.data.errcode === 0 && detail.data.data.id === material.material_id); if (materialDetail) { const meterailData = materialDetail.data.data; material.model = meterailData.model material.fetch_category_id = meterailData.fetch_category_id material.tax_rate = meterailData.tax_rate material.orderId = meterailData.orderId } return material; }); } return materialArr; }; 优化这段代码

2023-06-07 上传

<template> <el-form :inline="true" :model="formData" class="demo-form-inline"> <el-form-item label="品牌 "> <el-select v-model="formData.name" multiple placeholder="请选择窗口" style="width: 240px"> <el-option v-for="item in options" :key="item.id" :label="item.winname" :value="item.id" /> </el-select> </el-form-item> <el-form-item> <el-date-picker style="width: 260px;" v-model="formData.dateRange" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYY-MM-DD" /> </el-form-item> <el-form-item> <el-button type="primary" @click="onSubmit">查询</el-button> </el-form-item> </el-form>
</template> <script setup lang="ts"> import { onMounted, ref, reactive } from 'vue' import * as echarts from 'echarts' import { lendlistApi,windataApi,typeinfoApi} from '@/api/index' import * as dayjs from 'dayjs' import { lowerCase } from 'lodash'; import { type } from 'os'; const formData = reactive({ winids: [], name:'', dateRange: [dayjs().add(-10, 'day').format("YYYY-MM-DD"), dayjs().format("YYYY-MM-DD")] }) const options = ref([]) onMounted(() => { callwindataApi() calltypeinfoApi() }) const calltypeinfoApi = () => { typeinfoApi.select.call().then((res: any) => { console.log(res); options.value = res }) } const onSubmit = () => { console.log(formData.winids.length); callwindataApi() } const callwindataApi = () => { let params = {} if (formData.length != 0) { params.type = formData.type } windataApi.select.call({type :formData.type} ).then((data: any) => { console.log(data) initChart(data) }) } const initChart = (data: any) => { let days = new Set(data.map((item: any) => item.day)) let types = new Set(data.map((item: any) => item.type)) let myChart = echarts.init(document.getElementById("myChart")); console.log(data); myChart.clear() let option = { title: { text: '借用统计' }, tooltip: {}, legend: { data: [...types] }, xAxis: { data: [...days] }, yAxis: {}, series: [] }; for (let type of types) { option.series.push({ name: type, type: 'bar', data: data.filter(p => p.type == type).map(item => item.count) }) } myChart.setOption(option

2023-05-11 上传