【问题标题】:write a function that gets passed an object and returns an array of the object's properties编写一个函数,传递一个对象并返回一个对象属性的数组
【发布时间】:2013-08-23 05:26:32
【问题描述】:

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

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

【问题讨论】:

  • 你注意到这段代码有什么问题?
  • 我自己都不认识。但我能感觉到我的代码不是解决方案。
  • 我们可以为您提供解决方案,但那是作弊,不是吗?通过解释您尝试过的方法以及原因,帮助我们帮助您。例如,所有这些循环是做什么用的?当你写它们的时候你有什么想法?
  • 我想要先将所有参数合并到一个对象中。然后我想把这个对象的每个属性都放入一个数组中。这是解决问题的正确思路吗?
  • @bfavaretto - 我认为基于 Penghan 在这里展示的一些东西,Penghan 确实需要研究和寻找更有效、更好的代码。这看起来像是从各地收集的一堆乱七八糟的东西,而且了解很少。我将 Penghan 指向 MDN 跨浏览器实现进行研究。

标签: javascript


【解决方案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. 对于obj 中的每个属性property,请执行以下操作:
    1. 如果属性property属于obj并且
    2. 如果obj[property] 不是函数,则:
      1. 将属性property 添加到properties 数组中。
  3. 返回properties 数组。

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

【讨论】:

  • 非常深入的解释。非常感谢!
  • @PenghanYang 查看stackoverflow.com/a/8159434/802397,这样您就可以了解 Aadit 对 hasOwnProperty.call 所做的工作 - 本质上,在某些浏览器(旧版 IE)中,某些主机对象将没有 hasOwnProperty 函数,即使它在 JS 实现中可用。您可以通过从全局 Object.prototype.hasOwnProperty 中调用它来获取它,然后将其与 call() 一起使用以将其应用于当前对象。
  • @Keith 此外,任何最终不从Object.prototype 继承的对象很可能没有hasOwnProperty 方法。例如,通过调用Object.create(null) 创建的对象没有hasOwnProperty 函数。更不用说人们可以覆盖hasOwnProperty 方法:{ hasOwnProperty: function () { alert("Trolled ya!"); } }
【解决方案2】:

您的代码存在很多问题。您需要的答案在 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;
}

【讨论】:

  • 非常感谢。 "typeof Object.hasOwnProperty === 'function'" 是为了检查浏览器是否有 ".hasOwnProperty" 方法吗?
  • @PenghanYang 是正确的 - 如果第一级未定义,typeof 运算符将允许您查看对象的范围而不会中断。例如,如果你试图说 if(myObject.property) 并且 myObject 是未定义的,你会得到一个错误。但是,如果您说 if(typeof myObject.property === 'string'),并且 myObject 没有定义,那么您的 if 语句只会得到 false。
【解决方案3】:

好的,我去...

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

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

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

【讨论】:

    猜你喜欢
    • 2023-02-02
    • 2019-11-04
    • 1970-01-01
    • 2019-10-18
    • 2021-03-17
    • 2020-04-06
    • 2015-06-08
    • 1970-01-01
    • 2018-12-29
    相关资源
    最近更新 更多