Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何列出JavaScript对象的属性?_Javascript - Fatal编程技术网

如何列出JavaScript对象的属性?

如何列出JavaScript对象的属性?,javascript,Javascript,假设我这样创建一个对象: var myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"}; 检索属性名列表的最佳方法是什么?i、 e.我希望以一些变量“键”结束,以便: keys == ["ircEvent", "method", "regex"] 在现代浏览器(IE9+、FF4+、Chrome5+、Opera12+、Safari5+)中,您可以使用内置方法: 以上为完整的po

假设我这样创建一个对象:

var myObject =
        {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
检索属性名列表的最佳方法是什么?i、 e.我希望以一些变量“键”结束,以便:

keys == ["ircEvent", "method", "regex"]
在现代浏览器(IE9+、FF4+、Chrome5+、Opera12+、Safari5+)中,您可以使用内置方法:

以上为完整的polyfill,但简化版本为:

var getKeys = function(obj){
   var keys = [];
   for(var key in obj){
      keys.push(key);
   }
   return keys;
}
或者将
var getKeys
替换为
Object.prototype.keys
,以允许您对任何对象调用
.keys()
。扩展原型有一些副作用,我不建议这样做。

如前所述,您可以使用“for in”构造在对象上迭代其属性名称。但是,您将迭代对象的原型链中的所有属性名称。如果只想在对象自身的属性上迭代,可以使用该方法。因此有以下几点

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        /* useful code here */
    }
}
IE不支持本机属性的(obj中的i)。这是我能找到的所有道具的清单

看起来stackoverflow做了一些愚蠢的过滤

该列表可在此google group帖子的底部找到:-

我非常喜欢dump函数


请注意,Firefox4、Chrome 6、Safari 5、IE 9及更高版本支持Object.keys和其他ECMAScript 5方法

例如:

var o = {"foo": 1, "bar": 2}; 
alert(Object.keys(o));
ECMAScript 5兼容性表:


新方法的描述:

正如Sam Dutton所回答的,ECMAScript第5版中已经引入了一种用于此目的的新方法
Object.keys()
将执行您想要的操作,并且在Chrome 6、Safari 5和中受支持

您还可以在不支持该方法的浏览器中非常轻松地实现该方法。但是,有些实现与Internet Explorer不完全兼容。这里有一个更兼容的解决方案:

Object.keys = Object.keys || (function () {
    var hasOwnProperty = Object.prototype.hasOwnProperty,
        hasDontEnumBug = !{toString:null}.propertyIsEnumerable("toString"),
        DontEnums = [ 
            'toString', 'toLocaleString', 'valueOf', 'hasOwnProperty',
            'isPrototypeOf', 'propertyIsEnumerable', 'constructor'
        ],
        DontEnumsLength = DontEnums.length;
        
    return function (o) {
        if (typeof o != "object" && typeof o != "function" || o === null)
            throw new TypeError("Object.keys called on a non-object");
    
        var result = [];
        for (var name in o) {
            if (hasOwnProperty.call(o, name))
                result.push(name);
        }
    
        if (hasDontEnumBug) {
            for (var i = 0; i < DontEnumsLength; i++) {
                if (hasOwnProperty.call(o, DontEnums[i]))
                    result.push(DontEnums[i]);
            }   
        }
    
        return result;
    };
})();
Object.keys=Object.keys | |(函数(){
var hasOwnProperty=Object.prototype.hasOwnProperty,
HasdontenUnbug=!{toString:null}.propertyIsEnumerable(“toString”),
DontEnums=[
“toString”、“ToLocalString”、“valueOf”、“hasOwnProperty”,
“isPrototypeOf”、“propertyIsEnumerable”、“constructor”
],
DontEnumsLength=DontEnums.length;
返回函数(o){
if(typeof o!=“object”&&typeof o!=“function”| o==null)
抛出新的TypeError(“对非对象调用Object.keys”);
var结果=[];
for(o中的变量名称){
if(hasOwnProperty.call(o,name))
结果.推送(名称);
}
如果(hasDontEnumBug){
对于(变量i=0;i
请注意,当前接受的答案不包括对hasOwnProperty()的检查,而是返回通过原型链继承的属性。它也没有解释Internet Explorer中著名的DontEnum错误,即原型链上的不可枚举属性导致本地声明的同名属性继承其DontEnum属性

实现Object.keys()将为您提供更健壮的解决方案


编辑:在最近与Prototype的一位著名贡献者进行讨论后,我根据他找到的
对象.forIn()
函数的代码实现了DontEnum bug的解决方法。

如果您试图只获取元素而不获取函数,那么这段代码可以帮助您

this.getKeys = function() {

    var keys = new Array();
    for(var key in this) {

        if( typeof this[key] !== 'function') {

            keys.push(key);
        }
    }
    return keys;
}

这是我的HashMap实现的一部分,我只需要键,“this”是包含键的HashMap对象

这将在大多数浏览器中工作,即使在IE8中,也不需要任何类型的库。我是你的钥匙

var myJSONObject =  {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"}; 
var keys=[];
for (var i in myJSONObject ) { keys.push(i); }
alert(keys);

在支持js 1.8的浏览器下:

[i for(i in obj)]

可以使用jQuery执行以下操作:

var objectKeys = $.map(object, function(value, key) {
  return key;
});
如果有帮助,Mozilla将介绍如何在不受支持的浏览器中执行此操作:

if (!Object.keys) {
  Object.keys = (function () {
    var hasOwnProperty = Object.prototype.hasOwnProperty,
        hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
        dontEnums = [
          'toString',
          'toLocaleString',
          'valueOf',
          'hasOwnProperty',
          'isPrototypeOf',
          'propertyIsEnumerable',
          'constructor'
        ],
        dontEnumsLength = dontEnums.length;

    return function (obj) {
      if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');

      var result = [];

      for (var prop in obj) {
        if (hasOwnProperty.call(obj, prop)) result.push(prop);
      }

      if (hasDontEnumBug) {
        for (var i=0; i < dontEnumsLength; i++) {
          if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
        }
      }
      return result;
    };
  })();
}
if(!Object.keys){
Object.keys=(函数(){
var hasOwnProperty=Object.prototype.hasOwnProperty,
HasdontenUnbug=!({toString:null}).propertyIsEnumerable('toString'),
多特南=[
“toString”,
“Tolocalesting”,
“价值”,
“hasOwnProperty”,
“isPrototypeOf”,
“propertyIsEnumerable”,
“构造函数”
],
dontEnumsLength=dontEnums.length;
返回函数(obj){
如果(typeof obj!=='object'&&typeof obj!=='function'| | obj===null)抛出新的TypeError('object.keys在非对象上调用');
var结果=[];
用于(obj中的var prop){
if(hasOwnProperty.call(obj,prop))result.push(prop);
}
如果(hasDontEnumBug){
对于(变量i=0;i

您可以根据自己的喜好将其包括在内,但也可能包含在脚本堆栈顶部的某种
extensions.js
文件中。

基于公认的答案

如果对象具有要调用的属性,请说.properties()试试

var-keys=Object.keys(myJSONObject);
对于(var j=0;j
由于我在几乎每个项目中都使用下划线.js,所以我会使用以下函数:

var obj = {name: 'gach', hello: 'world'};
console.log(_.keys(obj));
其结果将是:

['name', 'hello']

对象。getOwnPropertyNames(obj)

除了通过
Object.keys(obj)
显示的属性外,此函数还显示不可枚举的属性

在JS中,每个属性都有几个属性,包括一个布尔
可枚举的

一般来说,不可枚举属性更“内在”,使用频率更低,但有时深入研究它们以了解
var obj = {name: 'gach', hello: 'world'};
console.log(_.keys(obj));
['name', 'hello']
var o = Object.create({base:0})
Object.defineProperty(o, 'yes', {enumerable: true})
Object.defineProperty(o, 'not', {enumerable: false})

console.log(Object.getOwnPropertyNames(o))
// [ 'yes', 'not' ]

console.log(Object.keys(o))
// [ 'yes' ]

for (var x in o)
    console.log(x)
// yes, base
var getKeys = function(obj) {
    var type = typeof  obj;
    var isObjectType = type === 'function' || type === 'object' || !!obj;

    // 1
    if(isObjectType) {
        return Object.keys(obj);
    }

    // 2
    var keys = [];
    for(var i in obj) {
        if(obj.hasOwnProperty(i)) {
            keys.push(i)
        }
    }
    if(keys.length) {
        return keys;
    }

    // 3 - bug for ie9 <
    var hasEnumbug = !{toString: null}.propertyIsEnumerable('toString');
    if(hasEnumbug) {
        var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
            'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];

        var nonEnumIdx = nonEnumerableProps.length;

        while (nonEnumIdx--) {
            var prop = nonEnumerableProps[nonEnumIdx];
            if (Object.prototype.hasOwnProperty.call(obj, prop)) {
                keys.push(prop);
            }
        }

    }

    return keys;
};
var obj = {a: 1, b: 2, c: 3};
Reflect.ownKeys(obj) // ["a", "b", "c"]
var obj = {a: 1, b: 2, c: 3};
obj[Symbol()] = 4;
Reflect.ownKeys(obj) // ["a", "b", "c", Symbol()]
let keys = Object.keys(myObject);
let values = Object.keys(myObject).map(key => myObject[key]);