Javascript 编写一个传递对象并返回对象数组的函数';s属性

Javascript 编写一个传递对象并返回对象数组的函数';s属性,javascript,Javascript,我的作业是: 编写一个“keys”函数,用于传递对象并返回对象属性数组。确保筛选出对象的方法。keys数组只有对象的名称/值对的名称。由于跨浏览器问题(旧浏览器不支持),无法使用Objectkeys方法。您的函数应该为所有浏览器提供相同的服务 我的初始代码如下: function keys(obj){ var key=""; var i = 0; var array = []; for(i = 1; i<arguments.length; i++){ for(ke

我的作业是: 编写一个“keys”函数,用于传递对象并返回对象属性数组。确保筛选出对象的方法。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;
 }
功能键(obj){
var key=“”;
var i=0;
var数组=[];

对于(i=1;i,您的代码有很多问题。您需要的答案在MDN中:

该函数完全按照教授的要求执行,并且可以跨浏览器执行。在“兼容性”下列出了一种称为“多边形填充”或object.keys的跨浏览器实现。请尝试整理该代码以了解它的功能:)

下面是我马上看到的您自己的代码的一些问题-它可能无法正常工作,我只是想给您一些错误操作的指导:

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

您的代码有很多问题。您需要的答案在MDN中:

该函数完全按照教授的要求执行,并且可以跨浏览器执行。在“兼容性”下列出了一种称为“多边形填充”或object.keys的跨浏览器实现。请尝试整理该代码以了解它的功能:)

下面是我马上看到的您自己的代码的一些问题-它可能无法正常工作,我只是想给您一些错误操作的指导:

// 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;
}
好的,我走了

function objProps(x){
var arr=[];
for (var k in x) if(typeof x[k] !='function' && x.hasOwnProperty(k)) {arr.push(k);}
return arr;
}
此代码按预期工作。使用对象调用它

把它唯一不是函数的键拿出来。

好的,我来了

function objProps(x){
var arr=[];
for (var k in x) if(typeof x[k] !='function' && x.hasOwnProperty(k)) {arr.push(k);}
return arr;
}
此代码按预期工作。使用对象调用它

只取出非函数的键。

这是解决方案:

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
    的所有属性的名称
  • 对于
    obj
    property
  • 的每个属性,请执行以下操作:
  • 如果属性
    property
    属于
    obj
  • 如果
    obj[property]
    不是函数,则:
  • 将属性
    属性
    添加到
    属性
    数组中
  • 返回
    属性
    数组
  • 请参见演示:

    这是解决方案:

    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
    的所有属性的名称
  • 对于
    obj
    property的每个属性,请执行以下操作:
  • 如果属性
    property
    属于
    obj
  • 如果
    obj[property]
    不是函数,则:
  • 将属性
    属性
    添加到
    属性
    数组中
  • 返回
    属性
    数组

  • 查看演示:

    您注意到这段代码有什么问题?我不知道自己。但我可以感觉到我的代码不是解决方案。我们可以给您解决方案,但那会作弊,不是吗?请帮助我们解释您尝试了哪些方法,以及为什么。例如,所有这些循环都是为了什么?当您你写的?我想先把所有的参数合并到一个对象中。然后我想把这个对象的所有属性都合并到一个数组中。这是解决问题的正确想法吗?@bfavaretto-我想根据彭汉在这里展示的一些东西,彭汉真的需要研究和观察更有效、更好的代码。这看起来像是一个从各地收集的混乱的集合,只需要很少的理解。我将Penghan指向MDN跨浏览器实现进行研究。你注意到这段代码有什么问题吗?我不知道我自己。但我能感觉到我的代码不是解决方案。我们可以给你解决方案,但那会这是在作弊,不是吗?请帮助我们解释一下你尝试过的方法,以及为什么。例如,所有这些循环都是用来做什么的?你写它们的时候想到了什么?我想先把所有参数合并到一个对象中。然后我想把这个对象的每个属性都合并到一个数组中。这是e关于如何解决问题的想法正确吗?@bfavaretto-我认为根据鹏汉在这里展示的一些东西,鹏汉确实需要研究和寻找更有效、更好的代码。这看起来像是一个从各地收集的混乱的集合,了解很少。我将鹏汉指向MDN跨浏览器实现学习说明。非常感谢。“typeof Object.hasOwnProperty==='function'”是否旨在检查浏览器是否有“.hasOwnProperty”方法?@PenghanYang这是正确的-如果第一级未定义,typeof操作符将允许您查看对象的范围而不中断。例如,如果您试图说(myObject.property)和myObject未定义,您会得到一个错误。但是如果您说,if(typeof myObject.property=='string')和myObject未定义,您只会在if语句中得到一个false。非常感谢。“typeof Object.hasOwnProperty=='function'”的目的是检查浏览器是否具有“.hasOwnProperty”方法?@PenghanYang这是正确的-如果第一级未定义,typeof运算符将允许您查看对象的范围而不会中断。例如,如果您试图说(myObject.property)和myObject是否未定义,您将得到一个错误。但是如果您说(typeof myObject.property=='string'),而且我的对象没有定义,你的if语句中只会出现一个错误。非常深刻的解释。非常感谢!@PenghanYang C