![](/img/trans.png)
[英]How to get all properties values of a Javascript Nested Objects (without knowing the keys)?
[英]How to get all properties values of a JavaScript Object (without knowing the keys)?
如果有一個 JavaScript object:
var objects={...};
假設,它有 50 多個屬性,在不知道屬性名稱(也就是不知道“鍵”)的情況下如何循環獲取每個屬性值?
根據您必須支持的瀏覽器,這可以通過多種方式完成。 絕大多數瀏覽器都支持 ECMAScript 5 (ES5),但請注意,下面的許多示例使用
Object.keys<\/code> ,這在 IE < 9 中不可用。請參閱
兼容性表<\/a>。
如果您必須支持舊版本的 IE,那么這是您的選擇:
嵌套的
if<\/code>確保您不會枚舉對象原型鏈中的屬性(這是您幾乎肯定想要的行為)。
你必須使用
而不是
因為 ECMAScript 5+ 允許您使用
Object.create(null)<\/code>創建無原型對象,而這些對象將沒有
hasOwnProperty<\/code>方法。
頑皮的代碼也可能產生覆蓋
hasOwnProperty<\/code>方法的對象。
ECMAScript 5+<\/h1>
您可以在任何支持 ECMAScript 5 及更高版本的瀏覽器中使用這些方法。 這些從對象中獲取值並避免枚舉原型鏈。
其中
obj<\/code>是您的對象:
如果你想要一些更緊湊的東西,或者你想小心循環中的函數,那么
Array.prototype.forEach<\/code>是你的朋友:
下一個方法構建一個包含對象值的數組。 這便於循環。
如果你想讓那些使用
Object.keys<\/code>的人對
null<\/code>安全(就像
for-in<\/code>一樣),那么你可以做
Object.keys(obj || {})...<\/code> 。
Object.keys<\/code>返回可枚舉<\/em>的屬性。
對於迭代簡單對象,這通常就足夠了。
如果您需要使用具有不可枚舉屬性的東西,則可以使用
Object.getOwnPropertyNames<\/code>代替
Object.keys<\/code> 。
ECMAScript 2015+(又名 ES6)<\/h1>
數組更容易使用 ECMAScript 2015 進行迭代。在循環中逐個處理值時,您可以利用這一點:
使用 ECMAScript 2015 fat-arrow 函數,將對象映射到值數組變成了單行:
ECMAScript 2015 引入了
Symbol<\/code> ,其實例可用作屬性名稱。
要獲取要枚舉的對象的符號,請使用
Object.getOwnPropertySymbols<\/code> (此函數是
Symbol<\/code>不能<\/em>用於創建私有屬性的原因)。
ECMAScript 2015 的新
Reflect<\/code> API 提供了
Reflect.ownKeys<\/code> ,它返回屬性名稱(包括不可枚舉的)和符號的列表。
數組推導(不要嘗試使用)<\/h2>
在發布之前,從 ECMAScript 6 中刪除<\/strong>了數組解析。 在移除它們之前,解決方案可能如下所示:
ECMAScript 2017+<\/h1>
ECMAScript 2016 添加了不影響該主題的功能。
ECMAScript 2017 規范添加了
Object.values<\/code>和
Object.entries<\/code> 。
兩者都返回數組(考慮到與
Array.entries<\/code>的類比,這會讓一些人感到驚訝)。
Object.values<\/code>可以按原樣使用,也可以與
for-of<\/code>循環一起使用。
如果您想同時使用鍵和值,那么
Object.entries<\/code>適合您。
它生成一個填充有
[key, value]<\/code>對的數組。
您可以按原樣使用它,或者(另請注意 ECMAScript 2015 解構賦值)在
for-of<\/code>循環中使用:
Object.values<\/code>墊片
<\/h1>
最后,正如評論中和 teh_senaus 在另一個答案中所指出的,可能值得將其中一個用作墊片。
不用擔心,以下並沒有改變原型,它只是給
Object<\/code>添加了一個方法(危險性要小得多)。
使用胖箭頭函數,這也可以在一行中完成:
您現在可以使用
如果您想在本機
Object.values<\/code>存在時避免填充,那么您可以執行以下操作:
最后...<\/h1>
請注意您需要支持的瀏覽器\/版本。 以上在實現方法或語言功能的地方是正確的。 例如,直到最近,對 ECMAScript 2015 的支持在 V8 中默認關閉,它支持 Chrome 等瀏覽器。 在您打算支持的瀏覽器實現您需要的功能之前,應避免使用 ECMAScript 2015 中的功能。 如果您使用babel<\/a>將代碼編譯為 ECMAScript 5,那么您可以訪問此答案中的所有功能。
"
通過使用一個簡單的
for..in<\/code>循環:
for(var key in objects) {
var value = objects[key];
}
這是一個可重用的函數,用於將值放入數組。 它也考慮了原型。
Object.values = function (obj) {
var vals = [];
for( var key in obj ) {
if ( obj.hasOwnProperty(key) ) {
vals.push(obj[key]);
}
}
return vals;
}
如果您有權訪問 Underscore.js,則可以像這樣使用_.values<\/code><\/a>函數:
_.values({one : 1, two : 2, three : 3}); // return [1, 2, 3]
var a = { a: 1, b: 2, c: 3 };
Object.keys(a).map(function(key){ return a[key] });
// result: [1,2,3]
如果你真的想要一個值數組,我發現這比使用 for ... in 循環構建一個數組更干凈。
ECMA 5.1+
function values(o) { return Object.keys(o).map(function(k){return o[k]}) }
const myObj = { a:1, b:2, c:3 }<\/code>
獲取所有值:
最短的方法:
您可以遍歷鍵:
foo = {one:1, two:2, three:3};
for (key in foo){
console.log("foo["+ key +"]="+ foo[key]);
}
ECMA2017 起:
Object.values(obj)<\/code>會將所有屬性值作為數組獲取。
https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_objects\/Object\/values<\/a>
該問題沒有指定是否還需要繼承和不可枚舉的屬性。
獲取所有東西,繼承的屬性和不可枚舉的屬性還有一個問題<\/a>,谷歌無法輕易找到。
如果我們要獲得所有繼承的和不可枚舉的屬性,我的解決方案是:
function getAllPropertyNames(obj) {
let result = new Set();
while (obj) {
Object.getOwnPropertyNames(obj).forEach(p => result.add(p));
obj = Object.getPrototypeOf(obj);
}
return [...result];
}
對於那些早期適應 CofeeScript 時代的人來說,這里有另一個等價物。
val for key,val of objects
顯然 - 正如我最近了解到的 - 這是最快的方法:
var objs = {...};
var objKeys = Object.keys(obj);
for (var i = 0, objLen = objKeys.length; i < objLen; i++) {
// do whatever in here
var obj = objs[objKeys[i]];
}
使用 polyfill,如:
if(!Object.values){Object.values=obj=>Object.keys(obj).map(key=>obj[key])}
我意識到我有點晚了,但這是新的 firefox 47
Object.values<\/code>方法的墊片<\/strong>
Object.prototype.values = Object.prototype.values || function(obj) {
return this.keys(obj).map(function(key){
return obj[key];
});
};
Object.entries 以更好的方式做到這一點。
使用:
Object.values()<\/code> ,我們傳入一個對象作為參數並接收一個值數組作為返回值。
這將返回給定對象自己的可枚舉屬性值的數組。 您將獲得與使用
for in<\/code>循環相同的值,但沒有 Prototype 上的屬性。
這個例子可能會讓事情更清楚:
const object1 = {
a: 'somestring',
b: 42
};
for (let [key, value] of Object.entries(object1)) {
console.log(`${key}: ${value}`);
}
// expected output:
// "a: somestring"
// "b: 42"
// order is not guaranteed
這是一個類似於 PHP 的 array_values() 的函數
function array_values(input) {
var output = [], key = '';
for ( key in input ) { output[output.length] = input[key]; }
return output;
}
由於 ,
Object.values(<object>)<\/code>將被內置在
ES7<\/a><\/strong> &
在等待所有瀏覽器支持它之前,您可以將它包裝在一個函數中:
然后 :
一旦瀏覽器與 ES7 兼容,您將無需更改代碼中的任何內容。<\/h3>"
我認為最簡單的選擇是這樣的:
Object.keys(data).forEach(function (key, index) {
var value = data[key];
console.log(key,index, value);
});
例如,這里添加了一段可運行的代碼:
const user = { name: 'Alex', age: 30, }; Object.keys(user).forEach(function (key, index) { var value = user[key]; console.log(key, index, value); });
我們可以使用以下三種方法獲取數據
使用 map function
data.map( item => { console.log(item) }
使用 for 循環
for( let i = 0; i < data.length; i++){
console.log(item);
}
在循環中使用
for(key in data) {
if(data.hasOwnProperty(key)) {
const value = data[key];
console.log(value);
}
}
var objects={...}; this.getAllvalues = function () {
var vls = [];
for (var key in objects) {
vls.push(objects[key]);
}
return vls;
}
在ECMAScript5<\/strong>中使用
keys = Object.keys(object);
現在我使用
Dojo Toolkit<\/a> ,因為舊瀏覽器不支持
Object.values<\/code> 。
require(['dojox/lang/functional/object'], function(Object) {
var obj = { key1: '1', key2: '2', key3: '3' };
var values = Object.values(obj);
console.log(values);
});
利用
console.log(variable)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.