问题:在循环体中hasOwnProperty 始终返回false
期望:属性为非原型属性时进行下一步操作
相关代码
Array.prototype.groupBy = function (cb, ctx = window) {
if (this === null || !Array.isArray(this)) {
throw TypeError('此方法是数组原型方法,你应该对数组调用它');
}
if (typeof cb !== "function") {
throw TypeError("你应该传入回调函数,而不是什么别的类型");
}
var key;
var resultObj = {};
for (var i = 0; i < this.length; i++) {
key = cb.call(ctx, this[i], i, this);
console.log(this[i].hasOwnProperty(key)); // undefined
// 这里只有在for in循环中才会生效
if(this[i].hasOwnProperty(key)) {
resultObj[key] = [];
resultObj[key].push(this[i]);
}
}
return resultObj;
}
const invent = [
{ name: 'apples', type: 'vegetables', quantity: 5 },
{ name: 'bananas', type: 'fruit', quantity: 0 },
{ name: 'goat', type: 'meat', quantity: 23 },
{ name: 'cherries', type: 'fruit', quantity: 5 },
{ name: 'fish', type: 'meat', quantity: 22 }
];
var res = invent.groupBy(function (item) {
return item.type
})
console.log(res);
如果期望是groupBy('type')这样的,可以这么写:
如果期望是groupBy(item => item.type)这样的,可以这么写:
没做边界处理啥的,不要纠结那么多。
PS:当你发现你的代码没有如期运行,可以多打印一些上下文,比如你的例子中,多打印一下this[i]和key,应该能很快找到思路