JavaScript循环of in

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


循环

const img= obj[`img${i}`]; 
 <div  class="movebody"  :style="{ height: `${boxHeight}px`}">
 </div>
这段代码使用了模板字符串和对象属性的动态访问方式。

${i}是一个模板字符串的语法,用于插入变量i的值。模板字符串用`` (反引号)包裹起来,其中${}部分会被变量的值替换。

obj[img${i}]则是使用动态属性访问的方式。在这个例子中,属性名由img字符串和变量i的值组成。这意味着,如果i的值是1,那么这个代码将尝试访问obj对象的img1属性。

总而言之,这段代码的目的是动态访问obj对象中以img开头,后面跟着变量i的值的属性,并将其赋值给变量img。你可以根据具体的上下文来判断这段代码的用途。

提示:以下是本篇文章正文内容,下面案例可供参考

一、 for…in 循环

for…in 循环:用于遍历对象的可枚举属性(不包括原型链上的属性)。
在每次迭代中,变量 key 会被赋值为对象的一个属性名,你可以通过 obj[key] 来访问对应的属性值

示例:for…in 循环会遍历 obj 对象的属性,key 的值会分别是 ‘imgSrc’‘name’。

const obj = { imgSrc: 'image.jpg', name: 'example' };

for (let key in obj) {
  if (key.includes('img')) {
    console.log(`${key}属性名包含'img'`);
  }
}
// 输出结果 : imgSrc属性名包含'img'

1.生成新的对象

如果你想将对象中属性名包含"img"的键值对重新生成为一个新的对象,可以使用以下代码实现:

const obj = { imgSrc: 'image.jpg', name: 'example', imgSrc222: 'image.jpg' };

const newObj = {};

for (let key in obj) {
  if (key.includes('img')) {
    newObj[key] = obj[key];
  }
}

console.log(newObj);

Object.keys()方法获取对象的所有属性,然后根据属性的数量进行循环。

const obj = { imgSrc: 'image.jpg', name: 'example', imgSrc222: 'image.jpg' };
const imgUrls = [];

const keys = Object.keys(obj);
for (let i = 0; i < keys.length; i++) {
  const key = keys[i];
  if (key.includes('img')) {
    imgUrls.push(obj[key]);
  }
}

console.log(imgUrls);

在这个例子中,通过Object.keys(obj)获取到obj对象中的所有属性名,然后使用一个循环遍历这些属性名。在循环体中,我们检查每个属性名是否包含"img",如果是,则将对应的属性值(obj[key])添加到imgUrls数组中。

二、for…of 循环

JavaScript 中也有使用 “of” 的循环结构,即 for…of 循环。与 for…in 循环不同,for…of 循环用于遍历可迭代对象(例如数组、字符串等),而不是对象的属性。

1.可迭代对象

可迭代对象是指实现了可迭代协议(Iterable protocol)的对象。可迭代协议要求对象必须实现一个具有特殊方法 Symbol.iterator 的函数,该函数返回一个迭代器(Iterator)对象。

迭代器对象用于定义如何进行迭代,它包含一个 next() 方法,该方法在每次迭代中返回一个包含两个属性的对象:value(表示当前迭代的值)和 done(表示迭代是否完成)。

在 JavaScript 中,一些内置的可迭代对象包括:

数组(Array):可以使用 for…of 循环遍历数组中的元素。
字符串(String):可以使用 for…of 循环遍历字符串中的字符。
MapSet:可以使用 for…of 循环遍历 Map 和 Set 中的条目。
除了这些内置对象,你也可以自定义实现可迭代对象,只需要在对象中定义 Symbol.iterator 方法,并返回一个迭代器对象,就可以使用 for…of 循环来遍历自定义对象。

需要注意的是,并不是所有的对象都是可迭代对象,如果一个对象没有实现可迭代协议,尝试对其使用 for…of 循环将会导致错误。

2.for…of 循环来遍历数组

for…of 循环来遍历数组的例子(示例):

const arr = [1, 2, 3, 4, 5];

for (let item of arr) {
  console.log(item);
}
// 输出:
// 1
// 2
// 3
// 4
// 5

3.for…of 循环来字符串数组

代码如下(示例):

const str = "Hello";

for (let char of str) {
  console.log(char);
}
// 输出:
// H
// e
// l
// l
// 

该处使用的url网络请求的数据。

4.for…of 循环来MapSet

除了数组,我们还可以使用 for…of 循环遍历其他可迭代对象,比如字符串、Map 和 Set。下面是对字符串和 Map 进行遍历的例子:

const map = new Map([[1, 'one'], [2, 'two'], [3, 'three']]);

for (let [key, value] of map) {
  console.log(key, value);
}
// 输出:
// 1 "one"
// 2 "two"
// 3 "three"

在字符串的例子中,我们使用 for…of 循环遍历了字符串中的每个字符,并将其打印出来。而在 Map 的例子中,我们使用 for…of 循环遍历了 Map 中的每个条目,并打印出键和对应的值。

通过使用 for…of 循环,我们可以方便地遍历可迭代对象中的元素,并对它们进行操作。

Set 去除重复

Set集合去重的原理
数组去重及原理总结

使用 Set 来进行去重操作是非常方便的,但有时可能会出现没有去重的情况。这可能是因为 Set 的去重是基于值的严格相等性进行的,而不是基于自定义的相等性比较函数。

举个例子,如果我们想要对一个包含对象的数组进行去重,可能会遇到没有去重的情况。这是因为 Set 在比较对象时,实际上比较的是对象的引用,而不是对象的内容。即使两个对象具有相同的属性和值,它们也会被视为不同的对象。

为了解决这个问题,我们需要自定义一个比较函数,并在每次插入元素到 Set 之前对其进行比较。例如,假设我们有一个包含对象的数组,我们可以使用 Array.from() 和自定义的比较函数来实现去重:

const arr = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' },
  { id: 1, name: 'Alice' }
];

const uniqueArr = Array.from(new Set(arr.map(JSON.stringify)), JSON.parse);

console.log(uniqueArr);
// 输出: [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]

在上述例子中,我们先使用 arr.map(JSON.stringify) 将数组中的每个对象转换为字符串表示,然后使用 Set 进行去重,最后使用 Array.from() 将去重后的结果转换回对象数组。

这样做的原因是 JSON.stringify 可以将对象转换为字符串表示,并且相同内容的对象将得到相同的字符串表示,这样就可以与 Set 的去重逻辑匹配了。然后使用 JSON.parse 将字符串解析为对象。

通过这种方式,我们可以基于对象的内容进行去重,而不是仅仅基于引用相等性。


在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值