js 实现一个 each(data, callback, context) 方法,能够满足对数组和对象的遍历操作(参数1无需考虑其他数据类型,且要求对象只遍历自身属性),在 each 的第三个可选参数可以自定义回调函数内 this 指向
时间: 2023-08-31 07:33:07 浏览: 123
js中遍历对象的属性和值的方法
5星 · 资源好评率100%
### 回答1:
以下是 JS 实现的代码:
```
function each(data, callback, context) {
if (Array.isArray(data)) {
for (var i = 0, len = data.length; i < len; i++) {
if (callback.call(context, data[i], i, data) === false) {
break;
}
}
} else if (typeof data === 'object') {
for (var key in data) {
if (data.hasOwnProperty(key)) {
if (callback.call(context, data[key], key, data) === false) {
break;
}
}
}
}
}
```
在调用时,您可以使用如下方式:
```
var data = [1, 2, 3, 4, 5];
each(data, function (value, index) {
console.log(value, index);
});
var obj = {a: 1, b: 2, c: 3};
each(obj, function (value, key) {
console.log(value, key);
});
```
其中,`callback` 参数为回调函数,在遍历数组或对象时将被执行,并在每次执行时传入当前遍历的值,索引(对于数组)或键(对于对象)以及数组或对象的引用。
`context` 参数为可选的,用于自定义回调函数内的 `this` 指向。如果不提供该参数,则 `this` 将指向 `undefined` 或全局对象(在严格模式下指向 `undefined`,否则指向全局对象)。
### 回答2:
在实现该 each(data, callback, context) 方法时,我们可以先对参数 data 进行类型判断。如果 data 是数组类型,则使用 for 循环迭代遍历数组元素,并在每次迭代调用回调函数 callback,同时将当前元素作为参数传入回调函数中。
如果 data 是对象类型,我们需要使用 for...in 循环遍历对象的自身属性。在每次遍历时,同样调用回调函数 callback,并将当前属性值作为参数传入。
对于可选参数 context,我们可以通过使用 JavaScript 中的 apply() 方法来改变回调函数内的 this 指向。apply() 方法接收两个参数,第一个参数是要设置为 this 的对象,第二个参数是一个数组或类数组对象,作为回调函数的参数列表。
最终实现代码如下所示:
```javascript
function each(data, callback, context) {
if(Array.isArray(data)){
for(let i=0; i<data.length; i++){
callback.apply(context, [data[i]]);
}
} else if(typeof data === 'object' && data !== null){
for(let key in data){
if(data.hasOwnProperty(key)){
callback.apply(context, [data[key]]);
}
}
} else {
throw new TypeError('Invalid data type');
}
}
```
使用示例:
```javascript
const arr = [1, 2, 3];
each(arr, function(item){
console.log(item);
}, this); // 输出 1 2 3
const obj = {a: 1, b: 2, c: 3};
each(obj, function(value){
console.log(value);
}, this); // 输出 1 2 3
```
以上代码实现了一个能够满足对数组和对象的遍历操作,并可以自定义回调函数内 this 指向的 each(data, callback, context) 方法。
### 回答3:
```javascript
function each(data, callback, context) {
if (Array.isArray(data)) { // 数组的遍历操作
for (var i = 0; i < data.length; i++) {
callback.call(context, data[i], i, data);
}
} else if (typeof data === 'object') { // 对象的遍历操作
for (var key in data) {
if (data.hasOwnProperty(key)) { // 只遍历自身属性
callback.call(context, data[key], key, data);
}
}
}
}
```
上述js代码实现了一个each方法,可以满足对数组和对象的遍历操作。该方法接受三个参数:
- data: 要遍历的数组或对象;
- callback: 对每个元素执行的回调函数;
- context: 可选参数,指定回调函数内的this指向。
当data为数组时,通过for循环依次遍历数组元素,对每个元素调用callback函数,使用call方法将第三个参数context作为回调函数内的this指向,并传递当前元素、索引和整个数组作为对应的参数。
当data为对象时,通过for...in循环遍历对象的属性,对每个属性调用callback函数,使用call方法将第三个参数context作为回调函数内的this指向,并传递当前属性的值、属性名和整个对象作为对应的参数。
需要注意的是,遍历对象时只遍历自身属性,通过hasOwnProperty方法进行判断。
这样,使用each函数可以对数组和对象进行遍历操作,并且可以通过context参数自定义回调函数内的this指向。
阅读全文