0

我的作业是这样的:编写一个“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;
 }

我很确定我的功能有很多问题。你能帮我吗?谢谢!

4

3 回答 3

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;
}

上面的代码逐行执行以下操作:

  1. 创建一个空数组properties来保存 的所有属性的名称obj
  2. property对于do 的每个属性obj
    1. 如果该财产property属于obj并且
    2. 如果obj[property]不是函数,则:
      1. 将属性添加propertyproperties数组中。
  3. 返回properties数组。

查看演示:http: //jsfiddle.net/qVgVn/

于 2013-08-21T02:02:38.083 回答
1

你的代码有很多问题。您需要的答案在 MDN 中:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

该功能完全按照您的教授的要求执行,并且可以跨浏览器执行。在“兼容性”下列出了 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;
}
于 2013-08-21T01:17:23.750 回答
1

好的,我去...

function objProps(x){
var arr=[];
for (var k in x) if(typeof x[k] !='function' && x.hasOwnProperty(k)) {arr.push(k);}
return arr;
}

此代码按预期工作。用对象调用它...

取出它唯一不是函数的键。

于 2013-08-21T01:29:11.227 回答