Object.values ​​()의 대체 버전


79

Object.values()기능 의 대체 버전을 찾고 있습니다.
으로 여기에 설명 된 기능은 인터넷 익스플로러에서 지원되지 않습니다.

다음 예제 코드를 실행할 때 :

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

Firefox와 Chrome 모두에서 작동하지만 IE11에서 다음 오류가 발생합니다.

개체가 속성 또는 메서드 "값"을 지원하지 않습니다.

여기서 테스트 할 수 있습니다 : Fiddle .

그렇다면 빠른 수정은 무엇입니까?

답변:


179

키 배열 을 얻은 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])

2
감사! 내 각 5 코드, 나는 변화 objectValues = Object.values;objectValues = ((obj) => { return Object.keys(obj).map(e => obj[e]); });
제프

@Jeff 왜 각진 폴리 필을 보지 않습니까?
Saksham

angular8 polyfill.ts :import 'core-js/es/object/values';
wutzebaer

21

Object.values ​​()는 ES8 (2017 년 6 월) 사양의 일부입니다. Cordova를 사용하여 Android 5.0 Webview가 지원하지 않는다는 것을 깨달았습니다. 그래서 다음을 수행하여 기능이 지원되지 않는 경우에만 polyfill 함수를 생성했습니다.

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

16

Object는 ( 그렇지 않은 ) 최근 구현 이므로 모든 브라우저 (AKA IE8 이하) 를 지원 하려면 고유 한 함수를 만들어야합니다.

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

추신 : 방금 ecmascript-6태그를 발견했습니다 . Btw 누군가가 필요할 경우를 대비 하여이 답변을 여기에 보관합니다.


9

이미 core-js를 사용하고 있다면 (예 : Angular 사용) 해당 폴리 필을 가져올 수 있습니다.

   import 'core-js/es7/object';

사용중인 Angular 버전에 따라 가져 오기를 변경해야 할 수도 있습니다. import 'core-js / es / object';
Mark Thompson

7

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

UnderscoreJS를 사용하는 사람들의 경우 다음을 사용하여 객체 값을 가져올 수 있습니다 _.values.

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

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>


2
프로토 타입 방법이 아닙니다.
Bergi

0

나는 그것이 오래된 주제라는 것을 알고 있습니다. 나는 arround를하고 있었고 다른 구현을 추가하고 싶습니다. 그것은 단순히지도 자체가 reduce로 구현 된지도 버전입니다.

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

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

console.log(valueArray);

그것은 일을하지만 나를 괴롭히는 무언가가 있습니다. 감속기 함수는 obj를 사용 하고 obj주입 되지 않았습니다 . 함수 내에서 전역 변수를 피하고 함수를 더 테스트 가능 하게 만들어야합니다 . 그래서 저는 obj를 매개 변수로 사용하고 실제 감속기 함수를 반환 하는 감속기 함수 도우미 가 있는이 버전을 선호 합니다 . 다음과 같이됩니다.

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


0

가장 좋은 방법은 ramda의 값 메소드로 바꾸는 것입니다.

import * as R from 'ramda';

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

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


-1

내 요구에 대한 답을 찾지 못했기 때문에 :

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


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

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

개체의 가능성을 사용하여 리터럴별로 주소를 지정합니다.


아니 대답 나의 친구
fluidguid

@fluidguid : 댓글 주셔서 감사합니다. 첫 번째 대답은 배워야합니다. 왜? 나는 문제가 IE에서 객체의 값을 얻는 것이라고 생각했습니다. 그래서, 즉 간단한 "for"를 가지고 있습니다. 뭐가 잘못 되었 니?
Frank34

-1

Object.keys ()를 사용하여 키 배열을 가져올 수 있습니다. 이것은 IE에서도 작동합니다. Object.keys ()에서 얻은 키를 사용하여 아래와 같이 값을 가져올 수 있으므로 Object.values ​​()는 값을 가져 오는 데 전혀 필요하지 않습니다.

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

1
정말 이것이 Object.values ​​????에 대한 좋은 해결책이라고 믿습니다.
boatcoder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.