簡體   English   中英

如何獲取 JavaScript Object 的所有屬性值(不知道密鑰)?

[英]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>。

ECMAScript 3+<\/h1>

如果您必須支持舊版本的 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]

ES5 Object.keys<\/code><\/a>

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

與 ES7 兼容,即使某些瀏覽器還不支持它<\/h1>

由於 , 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM