如何在Javascript中获得数组键?
我有一个用这个代码创build的数组:
var widthRange = new Array(); widthRange[46] = { min:0, max:52 }; widthRange[66] = { min:52, max:70 }; widthRange[90] = { min:70, max:94 };  我想要在循环中获取每个值46,66,90。 我试过for (var key in widthRange)但是这给了我一大堆额外的属性(我假设它们是对象上的函数)。 由于值不是顺序的,我不能使用常规循环。 
 您需要调用hasOwnProperty函数来检查该属性是否实际上是在对象本身(而不是其原型)上定义的,如下所示: 
 for (var key in widthRange) { if (key === 'length' || !widthRange.hasOwnProperty(key)) continue; var value = widthRange[key]; } 
 请注意,您需要单独检查length 。 
 但是,你不应该在这里使用数组; 你应该使用一个常规的对象。 所有的Javascript对象作为关联数组。 
例如:
 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 }; 
 string化的键可以用Object.keys(array)查询。 
如果你正在做任何types的数组/操作或检查,我强烈推荐使用Underscore.js 。 这是小的,经过充分testing,并会节省你天/星期/年的JavaScript头痛。 这里是它的关键function:
按键
检索对象属性的所有名称。
 _.keys({one : 1, two : 2, three : 3}); => ["one", "two", "three"] 
 for (var i = 0; i < widthRange.length; ++i) { if (widthRange[i] != null) { // do something } } 
  你不能真正得到你设置的键,因为这不是一个数组的工作方式。  一旦你设置了元素46,你也有0到45集(尽pipe它们是null)。 
你总是可以有两个数组:
 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]]); } 
编辑得好,可能是我在这里都湿了…
 假设你的数组看起来像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"] 
你原来的例子对我来说工作得很好:
 <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 + ";     min/max = " + widthRange[key].min + "/" + widthRange[key].max + "<br />"); i++; } </script> </html> 
浏览器中的结果(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 
 我认为你应该使用一个对象( {} )而不是一个数组(())。 
一组数据与每个键相关联。 它尖叫着使用一个对象。 做:
 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]); } 
也许这样的一些实用工具可以帮助:
 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]); } 
 widthRange.map(function(_, i) { return i }); 
要么
 widthRange.map((_, i) => i); 
似乎工作。
 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 />"); } 
我写了一个函数适用于每个对象的实例(arrays是那些)。
 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; }; 
用法:
 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()); 
输出:
 > [ 1, 2, 3, 4, 5 ] > [ 7, 1, 2, 3, function () { return 4; }, 5 ] 
这可能对任何人都有用。
…?
或者,如果您有要使用的项目列表…
 var range = [46, 66, 90] , widthRange=[] , write=[]; widthRange[46] = { min:0, max:52 }; widthRange[66] = { min:52, max:70 }; widthRange[90] = { min:70, max:94 }; for(var x=0; x<range.length; x++){var key, wr; key = range[x]; wr = widthRange[key] || false; if(wr===false){continue;} write.push(['key: #',key, ', min: ', wr.min, 'max:', wr.max].join('')); }