我的作业如下: 写一个"键"传递一个对象并返回一个对象属性数组的函数。务必筛选出对象的方法。 keys数组仅具有对象的名称/值对的名称。由于跨浏览器问题(旧版浏览器中不支持),因此无法使用Objectkeys方法。您的功能应该为所有浏览器提供相同的服务。
我的初始代码如下:
function keys(obj){
var key="";
var i = 0;
var array = [];
for(i = 1; i<arguments.length; i++){
for(key in arguments[i]){
if(obj.hasOwnProperty&&(!_.isArray(obj))){
obj[key]=arguments[i][key];
}
}
}
for(var j = 0; j < obj.length; j++){
for(key in obj[j]){
array[j] = obj[j];
}
}
return array;
}
我很确定我的功能有很多问题。你能帮帮我吗?谢谢!
答案 0 :(得分:1)
您的代码存在很多问题。您需要的答案是在MDN中:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
这个功能确实完全符合你教授的要求,而且它是跨浏览器的。在“Compatability”下列出的object.keys有一种所谓的poly-fill或跨浏览器实现。尝试理清该代码以弄清楚它在做什么:)
以下是我自己看到的代码中的一些问题 - 它可能不是正常工作的代码,我只想给你一些错误的指导:
// Name your function something useful and descriptive.
function getKeysAsArray(obj){
// For starters, dont name a variable "array" - bad practice.
var key="",
i = 0,
results = [];
// First foor loop unnecessary, do not use arguments here
// because you already know the name of your argument.
for(key in obj){
// See if this browser supports has OwnProperty by using typeof
// which will fail gracefully, vs what u did which will stop the
// script from running
if(typeof Object.hasOwnProperty === 'function'){
// You probably shouldn't be using underscore _
if(obj.hasOwnProperty && !(obj instanceof Array)){
results.push(obj[key]);
}
}
}
return results;
}
答案 1 :(得分:1)
好的,我去......
function objProps(x){
var arr=[];
for (var k in x) if(typeof x[k] !='function' && x.hasOwnProperty(k)) {arr.push(k);}
return arr;
}
此代码按预期工作。用对象称呼它......
获取其唯一的键不是函数。
答案 2 :(得分:1)
这是解决方案:
function keys(obj) {
var hasOwnProperty = Object.prototype.hasOwnProperty;
var properties = [];
for (var property in obj)
if (hasOwnProperty.call(obj, property)
&& typeof obj[property] !== "function")
properties.push(property);
return properties;
}
上述代码逐行执行以下操作:
properties
以保存obj
的所有属性的名称。property
的每个媒体资源obj
:
property
属于obj
和obj[property]
不是函数,那么:
property
添加到properties
数组。properties
数组。