编写一个传递一个对象并返回该对象属性数组的函数

时间:2013-08-21 01:01:17

标签: javascript

我的作业如下: 写一个"键"传递一个对象并返回一个对象属性数组的函数。务必筛选出对象的方法。 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;
 }

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

3 个答案:

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

上述代码逐行执行以下操作:

  1. 创建一个空数组properties以保存obj的所有属性的名称。
  2. 对于property的每个媒体资源obj
    1. 如果属性property属于obj
    2. 如果obj[property]不是函数,那么:
      1. 将属性property添加到properties数组。
  3. 返回properties数组。
  4. 请参阅演示:http://jsfiddle.net/qVgVn/