js中的for循环、map、forEach、for in、for of、Object.keys()的区别
时间: 2024-05-21 08:17:08 浏览: 155
这些都是 JavaScript 中用于遍历数组和对象的方法,它们各自有不同的特点和应用场景。以下是它们的简要区别:
1. for 循环:是最基本的循环结构,可以通过控制条件来进行遍历,可以遍历数组和对象。
2. forEach:是数组的一个方法,用于遍历数组中的每个元素,它不返回任何值,一般用于执行一些副作用操作。
3. map:是数组的一个方法,用于遍历数组中的每个元素并返回一个新数组,新数组的元素是对原数组元素进行操作后的结果。
4. for in:用于遍历对象的可枚举属性,包括原型链上的属性。
5. for of:用于遍历可迭代对象(如数组、字符串、Map、Set 等),只遍历对象本身的属性。
6. Object.keys():用于获取对象的可枚举属性组成的数组。
总之,不同的遍历方法适用于不同的场景,需要根据具体情况选择使用。
相关问题
优化这段代码changeVal(data) { let {obj, i} = data; if (obj.relateField) { let checkList = ''; // 获取校验 obj.relateField.forEach(item => { Object.keys(item).forEach(val => { if (val == obj.elementValue) { checkList = item[Number(obj.elementValue)].split(',') } }) }) this.submitForm.factorlist[i].childBean.forEach(item => { checkList.forEach(val => { let splitItem = val.split('-'); if (item.elementName === splitItem[0]) { item.showHide = splitItem[1] === 'show'? true: false; } }) }) } },
优化后的代码如下:
changeVal(data) {
const { obj, i } = data;
const { relateField } = obj;
if (relateField) {
const checkList = relateField
.map(item => item[obj.elementValue])
.find(val => val !== undefined)
?.split(',') || [];
this.submitForm.factorlist[i].childBean.forEach(item => {
const [elementName, action] = checkList
.find(val => val.startsWith(`${item.elementName}-`))
?.split('-') || [];
if (elementName && action) {
item.showHide = action === 'show';
}
});
}
}
优化说明:
1. 使用解构赋值简化代码,提高代码可读性。
2. 使用了可选链运算符和空值合并语法,简化代码逻辑。
3. 使用了数组的 map、find 和 forEach 方法,提高代码可读性,降低了代码复杂度。
4. 增加了代码注释,提高了代码可维护性。
const relationFunctions = { ancestor: { linked(parent) { this.parent = parent; }, unlinked() { this.parent = null; }, }, descendant: { linked(child) { this.children = this.children || []; this.children.push(child); }, unlinked(child) { this.children = (this.children || []).filter((it) => it !== child); }, }, }; function mapKeys(source, target, map) { Object.keys(map).forEach((key) => { if (source[key]) { target[map[key]] = source[key]; } }); } function makeRelation(options, vantOptions, relation) { const { type, name, linked, unlinked, linkChanged } = relation; const { beforeCreate, destroyed } = vantOptions; if (type === 'descendant') { options.created = function () { beforeCreate && beforeCreate.bind(this)(); this.children = this.children || []; }; options.detached = function () { this.children = []; destroyed && destroyed.bind(this)(); }; } options.relations = Object.assign(options.relations || {}, { [`../${name}/index`]: { type, linked(node) { relationFunctions[type].linked.bind(this)(node); linked && linked.bind(this)(node); }, linkChanged(node) { linkChanged && linkChanged.bind(this)(node); }, unlinked(node) { relationFunctions[type].unlinked.bind(this)(node); unlinked && unlinked.bind(this)(node); }, }, }); } function VantComponent(vantOptions = {}) { const options = {}; mapKeys(vantOptions, options, { data: 'data', props: 'properties', mixins: 'behaviors', methods: 'methods', beforeCreate: 'created', created: 'attached', mounted: 'ready', relations: 'relations', destroyed: 'detached', classes: 'externalClasses', }); const { relation } = vantOptions; if (relation) { makeRelation(options, vantOptions, relation); } // add default externalClasses options.externalClasses = options.externalClasses || []; options.externalClasses.push('custom-class'); // add default behaviors options.behaviors = options.behaviors || []; options.behaviors.push(basic); // map field to form-field behavior if (vantOptions.field) { options.behaviors.push('wx://form-field'); } if (options.properties) { Object.keys(options.properties).forEach((name) => { if (Array.isArray(options.properties[name])) { // miniprogram do not allow multi type options.properties[name] = null; } }); } // add default options options.options = { multipleSlots: true, addGlobalClass: true, }; Component(options); } export { VantComponent };
这段代码是一个封装了微信小程序组件开发的工具库 Vant 中的一个函数 `VantComponent`。下面是函数的主要实现:
1. 将 vantOptions 中的字段映射到 options 中,例如将 vantOptions 的 data 映射为 options 的 data,将 vantOptions 的 props 映射为 options 的 properties。
2. 如果 vantOptions 中定义了 relation,则将其转换为小程序组件的 relations 字段,用于组件之间的关联。
3. 添加默认的 externalClasses 和 behaviors 字段,以及根据 field 字段添加 wx://form-field 行为。
4. 针对 properties 中的数组类型进行处理,因为小程序中不支持数组类型。
5. 添加默认的 options,包括 multipleSlots 和 addGlobalClass。
最终将 options 对象传入 Component 函数中,生成小程序组件。这个函数的作用是简化小程序组件开发的流程,提高开发效率。
阅读全文