Object.values()的替代版本

时间:2017-03-16 09:39:42

标签: javascript internet-explorer browser ecmascript-6

我正在寻找var options = { android: { senderID: "789175757493", ecb:"onNotification", forceShow: true }, } 功能的替代版本 作为described here,Internet Explorer不支持该功能。

执行以下示例代码时:

Object.values()

它适用于Firefox和Chrome,但在IE11中引发了以下错误:

  

对象不支持属性或方法"值"

您可以在这里测试一下:Fiddle

那么,什么是快速修复?

11 个答案:

答案 0 :(得分:118)

您可以使用Object.keys()获取一系列密钥,然后使用map()获取值。

var obj = { foo: 'bar', baz: 42 };
var values = Object.keys(obj).map(function(e) {
  return obj[e]
})

console.log(values)

使用ES6,您可以使用箭头功能在一行中编写。

var values = Object.keys(obj).map(e => obj[e])

答案 1 :(得分:11)

由于Object是( not so )最近的实现,如果你想支持所有浏览器(AKA IE8及以下版本),那么你需要创建自己的函数:

function objectValues(obj) {
    var res = [];
    for (var i in obj) {
        if (obj.hasOwnProperty(i)) {
            res.push(obj[i]);
        }
    }
    return res;
}

PS:刚注意到ecmascript-6标签。顺便说一句,我在这里保留这个答案,以防有人需要它。

答案 2 :(得分:11)

Object.values()是ES8(2017年6月)规范的一部分。使用Cordova,我意识到Android 5.0 Webview并不支持它。因此,我执行了以下操作,仅在不支持该功能时才创建polyfill函数:

if (!Object.values) Object.values = o=>Object.keys(o).map(k=>o[k]);

答案 3 :(得分:5)

您可以使用polyfill:



const valuesPolyfill = function values (object) {
  return Object.keys(object).map(key => object[key]);
};

const values = Object.values || valuesPolyfill;

console.log(values({ a: 1, b: 2, c: 3 }));




答案 4 :(得分:2)

var x = {Name: 'John', Age: 30, City: 'Bangalore'};
 
Object.prototype.values = function(obj) {
                                var res = [];
    for (var i in obj) {
        if (obj.hasOwnProperty(i)) {
            res.push(obj[i]);
        }
    }
    return res;
};
 
document.getElementById("tag").innerHTML = Object.values(x)
<p id="tag"></p>

答案 5 :(得分:1)

对于使用UnderscoreJS的人,您可以使用_.values获得对象值:

var obj = { foo: 'bar', baz: 42 };
console.log(_.values(obj)); // ['bar', 42]

答案 6 :(得分:1)

如果您已经在使用core-js(例如,使用Angular),则只需导入相应的polyfill:

   import 'core-js/es7/object';

答案 7 :(得分:0)

我知道这是一个古老的话题。我正在玩arround,只是想添加另一个实现。 它只是地图版本,地图本身用reduce:

实现

&#13;
&#13;
let obj = { foo: 'bar', baz: 42 };

const valueArray = Object.keys(obj).reduce((acc, key) => {
  acc.push(obj[key]);
  return acc;
}, []);

console.log(valueArray);
&#13;
&#13;
&#13;

它完成了这项工作,但却有些困扰我的事情。 reducer函数使用 obj obj 不是注入。我们应该避免函数内部的全局变量,并使我们的函数更强可测试。所以我更喜欢这个版本的 reducer function helper ,它将obj作为参数返回实际的reducer函数。它变成了:

&#13;
&#13;
let obj = { foo: 'bar', baz: 42 };

// reducer function helper take obj and return the actual reducer function
let reducerFuncHelper= obj => (acc, key) => {
  acc.push(obj[key]);
  return acc;
}
//much better
const valueArray = Object.keys(obj).reduce(reducerFuncHelper(obj), []);
console.log(valueArray);
&#13;
&#13;
&#13;

答案 8 :(得分:0)

最好的方法是将其替换为ramda的values方法:

import * as R from 'ramda';

const obj = { foo: 'bar', test: 10 };

console.log(R.values(obj)) // ['bar', 10]

答案 9 :(得分:-1)

因为我没有找到满足我需求的答案:

var obj = { foo: 'bar', baz: 42 };


console.log(obj[Object.keys(obj)[0]]) // bar

console.log(obj[Object.keys(obj)[1]])  // 42

使用对象根据每个文字处理它们的可能性。

答案 10 :(得分:-1)

您可以使用Object.keys()获得键数组。这也将在IE中工作。完全不需要Object.values()来获取值,因为我们可以使用从Object.keys()获得的键来获取值,如下所示:

var obj = { foo: 'bar', baz: 42 };
var keyArray = Object.keys(obj);
for(var i = 0; i < keyArray.length; i++)
    console.log(obj[keyArray[i]]);