Javascript 如何在Javascript中获取数组键?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2509432/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 00:40:34  来源:igfitidea点击:

How to get array keys in Javascript?

javascriptarrayskey

提问by DisgruntledGoat

I have an array created with this code:

我有一个使用此代码创建的数组:

var widthRange = new Array();
widthRange[46] = { min:0,  max:52 };
widthRange[66] = { min:52, max:70 };
widthRange[90] = { min:70, max:94 };

I want to get each of the values 46, 66, 90 in a loop. I tried for (var key in widthRange)but this gives me a whole bunch of extra properties (I assume they are functions on the object). I can't use a regular for loop since the values are not sequential.

我想在循环中获取每个值 46、66、90。我试过了,for (var key in widthRange)但这给了我一大堆额外的属性(我假设它们是对象上的函数)。我不能使用常规 for 循环,因为这些值不是顺序的。

回答by SLaks

You need to call the hasOwnPropertyfunction to check whether the property is actually defined on the object itself (as opposed to its prototype), like this:

您需要调用该hasOwnProperty函数来检查该属性是否实际上是在对象本身(而不是其原型)上定义的,如下所示:

for (var key in widthRange) {
    if (key === 'length' || !widthRange.hasOwnProperty(key)) continue;
    var value = widthRange[key];
}

Note that you need a separate check for length.
However, you shouldn't be using an array here at all; you should use a regular object. All Javascript objects function as associative arrays.

请注意,您需要单独检查length.
但是,您根本不应该在这里使用数组;您应该使用常规对象。所有 Javascript 对象都用作关联数组。

For example:

例如:

var widthRange = { };  //Or new Object()
widthRange[46] = { sel:46, min:0,  max:52 };
widthRange[66] = { sel:66, min:52, max:70 };
widthRange[90] = { sel:90, min:70, max:94 };

回答by thSoft

The stringified keys can be queried with Object.keys(array).

可以使用 查询字符串化的键Object.keys(array)

回答by Mike McKay

If you are doing any kind of array/collection manipulation or inspection I highly recommend using Underscore.js. It's small, well-tested and will save you days/weeks/years of javascript headache. Here is its keys function:

如果您正在进行任何类型的数组/集合操作或检查,我强烈建议您使用Underscore.js。它很小,经过充分测试,可以为您节省数天/数周/数年的 javascript 头痛。这是它的按键功能:

Keys

钥匙

Retrieve all the names of the object's properties.

检索对象属性的所有名称。

_.keys({one : 1, two : 2, three : 3});
=> ["one", "two", "three"]

回答by Pointy

for (var i = 0; i < widthRange.length; ++i) {
  if (widthRange[i] != null) {
    // do something
  }
}

You can't really get just the keys you've set because that's not how an Array works. Once you set element 46, you also have 0 through 45 set too (though they're null).

你真的不能只得到你设置的键,因为这不是 Array 的工作方式。设置元素 46 后,也设置了 0 到 45(尽管它们为空)。

You could always have twoarrays:

你总是可以有两个数组:

var widthRange = [], widths = [], newVal = function(n) {
  widths.push(n);
  return n;
};
widthRange[newVal(26)] = { whatever: "hello there" };

for (var i = 0; i < widths.length; ++i) {
  doSomething(widthRange[widths[i]]);
}

editwell it may be that I'm all wet here ...

编辑好吧,可能是我在这里都湿了......

回答by Morten

Say your array looked like arr = [ { a: 1, b: 2, c: 3 }, { a: 4, b: 5, c: 6 }, { a: 7, b: 8, c: 9 } ](or possibly other keys) you could do

假设您的数组看起来像 arr = [ { a: 1, b: 2, c: 3 }, { a: 4, b: 5, c: 6 }, { a: 7, b: 8, c: 9 } ](或可能是其他键),您可以这样做

arr.map((o) => {
    return Object.keys(o)
}).reduce((prev, curr) => {
    return prev.concat(curr)
}).filter((col, i, array) => {
    return array.indexOf(col) === i
});

["a", "b", "c"]

["a", "b", "c"]

回答by alexndreazevedo

widthRange.map(function(_, i) { return i });

or

或者

widthRange.map((_, i) => i);

回答by npup

I think you should use an Object ({}) and not an array ([]) for this.

我认为您应该为此使用 Object ( {}) 而不是数组 ( []) 。

A set of data is associated with each key. It screams for using an object. Do:

一组数据与每个键相关联。它为使用对象而尖叫。做:

var obj = {};
obj[46] = { sel:46, min:0,  max:52 };
obj[666] = { whatever:true };

// This is what for..in is for
for (var prop in obj) {
  console.log(obj[prop]);
}

Maybe some utility stuff like this can help:

也许像这样的一些实用工具可以提供帮助:

window.WidthRange = (function () {
  var obj = {};
  return {
    getObj: function () {return obj;}
    , add: function (key, data) {
        obj[key] = data;
        return this; // enabling chaining
      }
  }
})();

// Usage (using chaining calls):
WidthRange.add(66, {foo: true})
.add(67, {bar: false})
.add(69, {baz: 'maybe', bork:'absolutely'});

var obj = WidthRange.getObj();
for (var prop in obj) {
  console.log(obj[prop]);
}

回答by Andy Shellam

Your original example works just fine for me:

你原来的例子对我来说很好用:

<html>
<head>
</head>
<body>
<script>
var widthRange = new Array();
widthRange[46] = { sel:46, min:0,  max:52 };
widthRange[66] = { sel:66, min:52, max:70 };
widthRange[90] = { sel:90, min:70, max:94 };

var i = 1;
for (var key in widthRange)
{
    document.write("Key #" + i + " = " + key + "; &nbsp;&nbsp;&nbsp; min/max = " + widthRange[key].min + "/" + widthRange[key].max + "<br />");
    i++;
}
</script>
</html>

Results in the browser (Firefox 3.6.2 on Windows XP):

浏览器中的结果(Windows XP 上的 Firefox 3.6.2):

Key #1 = 46;     min/max = 0/52
Key #2 = 66;     min/max = 52/70
Key #3 = 90;     min/max = 70/94

回答by Michael D. Irizarry

Seems to work.

似乎工作。

var widthRange = new Array();
widthRange[46] = { sel:46, min:0,  max:52 };
widthRange[66] = { sel:66, min:52, max:70 };
widthRange[90] = { sel:90, min:70, max:94 };

for (var key in widthRange)
{
    document.write(widthRange[key].sel + "<br />");
    document.write(widthRange[key].min + "<br />");
    document.write(widthRange[key].max + "<br />");
}

回答by schwarzkopfb

I wrote a function what works fine with every instance of Objects (Arrays are those).

我写了一个函数,它适用于每个对象实例(数组就是那些)。

Object.prototype.toArray = function()
{
    if(!this)
    {
      return null;
    }

    var c = [];

    for (var key in this) 
    {
        if ( ( this instanceof Array && this.constructor === Array && key === 'length' ) || !this.hasOwnProperty(key) ) 
        {
            continue;
        }

        c.push(this[key]);
    }

    return c;
};

Usage:

用法:

var a   = [ 1, 2, 3 ];
a[11]   = 4;
a["js"] = 5;

console.log(a.toArray());

var b = { one: 1, two: 2, three: 3, f: function() { return 4; }, five: 5 };
b[7] = 7;

console.log(b.toArray());

Output:

输出:

> [ 1, 2, 3, 4, 5 ]
> [ 7, 1, 2, 3, function () { return 4; }, 5 ]

It may be useful for anyone.

它可能对任何人都有用。