다음과 같은 객체를 변환하고 싶습니다.
{"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
다음과 같이 키-값 쌍의 배열로
[[1,5],[2,7],[3,0],[4,0]...].
JavaScript에서 객체를 키-값 쌍의 배열로 변환하려면 어떻게해야합니까?
답변
당신은 이것을 Object.keys()
하고 map()
할 수 있습니다
var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
var result = Object.keys(obj).map(function(key) {
return [Number(key), obj[key]];
});
console.log(result);
답변
가장 좋은 방법은 :
var obj ={"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
Object.entries(obj);
entries
여기에 표시된대로 호출 하면 [key, value]
요청자가 요청한대로 쌍 을 반환 합니다.
또는을 호출하면 Object.values(obj)
값만 반환됩니다.
답변
Object.entries()
요소가[key, value]
직접 열거 할 수있는 열거 가능한 속성 쌍에 해당하는 배열 인 배열을 반환합니다.object
. 속성의 순서는 객체의 속성 값을 수동으로 반복하여 주어진 순서와 동일합니다.-https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries#Description
이 Object.entries
함수는 키가 숫자 대신 문자열 인 것을 제외하고는 거의 정확한 결과를 반환합니다.
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
console.log(Object.entries(obj));
키가 숫자가되어야하는 경우 각 쌍의 키를 강제 된 숫자로 바꾸는 콜백 함수를 사용하여 결과를 새 배열에 매핑 할 수 있습니다.
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
const toNumericPairs = input => {
const entries = Object.entries(input);
return entries.map(entry => Object.assign(entry, { 0: +entry[0] }));
}
console.log(toNumericPairs(obj));
Object.assign
위의 예제에서 화살표 함수와 맵 콜백을 사용하여 Object.assign
할당되는 객체 를 반환하는 사실을 활용하여 하나의 명령으로 유지할 수 있으며 단일 명령 화살표 함수의 반환 값은 명령의 결과입니다.
이것은 다음과 같습니다.
entry => {
entry[0] = +entry[0];
return entry;
}
주석에서 @TravisClarke가 언급했듯이 맵 기능은 다음과 같이 단축 될 수 있습니다.
entry => [ +entry[0], entry[1] ]
그러나 기존 배열을 수정하지 않고 각 키-값 쌍에 대해 새 배열을 작성하므로 키-값 쌍 배열의 양이 두 배가됩니다. 원래 항목 배열에 여전히 액세스 할 수 있지만 해당 항목과 가비지 수집되지 않습니다.
이제 in-place 메소드를 사용하여 키-값 쌍을 보유하는 두 개의 배열 (입력 및 출력 배열)을 계속 사용하더라도 총 배열 수는 하나씩 만 변경됩니다. 입력 및 출력 배열은 실제로 배열로 채워지는 것이 아니라 배열에 대한 참조이며 해당 참조는 메모리에서 무시할만한 공간을 차지합니다.
- 각 키-값 쌍을 내부에서 수정하면 메모리 크기는 무시할만한 수준으로 증가하지만 문자를 몇 개 더 입력해야합니다.
- 각 키-값 쌍에 대해 새 배열을 만들면 필요한 메모리 양이 두 배가되지만 문자를 조금 더 입력해야합니다.
한 단계 더 나아가 엔트리 배열을 새로운 배열에 매핑하는 대신 내부에서 수정함으로써 성장을 완전히 없앨 수 있습니다.
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
const toNumericPairs = input => {
const entries = Object.entries(obj);
entries.forEach(entry => entry[0] = +entry[0]);
return entries;
}
console.log(toNumericPairs(obj));
답변
ES6가 표준 인 2018 년에 이러한 답변 중 일부를 요약합니다.
객체로 시작 :
let const={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
- 맹목적으로 배열에서 값을 얻으려면 키를 신경 쓰지 마십시오.
const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.values(obj));
//[9,8,7,6,5,4,3,2,1,0,5]
- 배열에서 쌍을 얻는 간단한 방법 :
const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj));
//[["1",9],["2",8],["3",7],["4",6],["5",5],["6",4],["7",3],["8",2],["9",1],["10",0],["12",5]]
- 이전과 동일하지만 각 쌍에 숫자 키가 있습니다.
const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj).map(([k,v])=>[+k,v]));
//[[1,9],[2,8],[3,7],[4,6],[5,5],[6,4],[7,3],[8,2],[9,1],[10,0],[12,5]]
- 새 배열의 키로 object 속성을 사용하면 희소 배열을 만들 수 있습니다.
const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj).reduce((ini,[k,v])=>(ini[k]=v,ini),[]));
//[undefined,9,8,7,6,5,4,3,2,1,0,undefined,5]
이 마지막 방법은 키 값에 따라 배열 순서를 재구성 할 수도 있습니다. 때로는 이것이 원하는 행동 일 수도 있습니다 (때로는 그렇지 않습니다). 그러나 이제 장점은 값이 올바른 배열 슬롯에 색인되어 검색을 수행하는 데 필수적이며 사소한 것입니다.
- 배열 대신 맵
마지막으로 (원래 질문의 일부는 아니지만 완전성을 위해) 키 또는 값을 사용하여 쉽게 검색해야하지만 숫자 배열로 변환 할 필요없이 희소 배열, 중복 및 재정렬을 원하지 않는 경우 ( 심지어 매우 복잡한 키에 액세스 할 수있는 경우) 배열 (또는 객체)이 필요하지 않습니다. 나는 추천 할 것이다Map
대신 합니다.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
let r=new Map(Object.entries(obj));
r.get("4"); //6
r.has(8); //true
답변
Object.entries
당신에게 효과가 없다면 또 다른 해결책 .
const obj = {
'1': 29,
'2': 42
};
const arr = Array.from(Object.keys(obj), k=>[`${k}`, obj[k]]);
console.log(arr);
답변
Ecmascript 6에서
var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
var res = Object.entries(obj);
console.log(res);
답변
사용하다 Object.keys
및 Array#map
방법.
var obj = {
"1": 5,
"2": 7,
"3": 0,
"4": 0,
"5": 0,
"6": 0,
"7": 0,
"8": 0,
"9": 0,
"10": 0,
"11": 0,
"12": 0
};
// get all object property names
var res = Object.keys(obj)
// iterate over them and generate the array
.map(function(k) {
// generate the array element
return [+k, obj[k]];
});
console.log(res);