다음과 같은 객체를 변환하고 싶습니다.
{"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에서 객체를 키-값 쌍의 배열로 변환하려면 어떻게해야합니까?
다음과 같은 객체를 변환하고 싶습니다.
{"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));
Object.entries(obj).map(e => [+e[0], e[1]]);
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]]
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);
사용하다 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);
사용 Object.entries
에서의 Object의 각 요소 얻기 위해 key & value
다음 형식을 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 res = Object.entries(obj).map(([k, v]) => ([Number(k), v]));
console.log(res);
그러나 키가 점진적으로 정렬 될 것이 확실하다면 다음과 같이 사용 Object.values
하고 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};
// idx is the index, you can use any logic to increment it (starts from 0)
let result = Object.values(obj).map((e, idx) => ([++idx, e]));
console.log(result);
lodash를 사용하면 위에 제공된 답변 외에도 출력 배열에 키를 가질 수 있습니다.
에 대한:
const array = _.values(obj);
obj가 다음과 같은 경우 :
{ “art”: { id: 1, title: “aaaa” }, “fiction”: { id: 22, title: “7777”} }
그런 다음 배열은 다음과 같습니다.
[ { id: 1, title: “aaaa” }, { id: 22, title: “7777” } ]
대신 쓰는 경우 ( 'genre'는 선택한 문자열입니다) :
const array= _.map(obj, (val, id) => {
return { ...val, genre: key };
});
당신은 얻을 것이다 :
[
{ id: 1, title: “aaaa” , genre: “art”},
{ id: 22, title: “7777”, genre: “fiction” }
]
을 사용할 수 있습니다 Object.values([])
. 아직 작성하지 않은 경우이 폴리 필이 필요할 수 있습니다.
const objectToValuesPolyfill = (object) => {
return Object.keys(object).map(key => object[key]);
};
Object.values = Object.values || objectToValuesPolyfill;
https://stackoverflow.com/a/54822153/846348
그럼 당신은 할 수 있습니다 :
var object = {1: 'hello', 2: 'world'};
var array = Object.values(object);
js의 배열은 숫자 키 만 사용할 수 있으므로 객체에서 다른 것을 사용하면`0,1,2 ... x``가됩니다.
예를 들어 고유 키가있는 경우 중복을 제거하는 것이 유용 할 수 있습니다.
var obj = {};
object[uniqueKey] = '...';
객체를 배열로 재귀 변환
function is_object(mixed_var) {
if (mixed_var instanceof Array) {
return false;
} else {
return (mixed_var !== null) && (typeof( mixed_var ) == 'object');
}
}
function objectToArray(obj) {
var array = [], tempObject;
for (var key in obj) {
tempObject = obj[key];
if (is_object(obj[key])) {
tempObject = objectToArray(obj[key]);
}
array[key] = tempObject;
}
return array;
}
아래와 같이 키의 숫자를 문자열 유형으로 변경할 수 있습니다.
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 [String(key), obj[key]];
});
console.log(result);
_.castArray (obj)를 사용할 수 있습니다 .
예:
_.castArray({ 'a': 1 });
// => [{ 'a': 1 }]
NaN
대신 반환 됩니다. 당신은, 당신의 열쇠로 문자열을 사용에서 수익을 변경하려는 경우[Number(key), obj[key]]
에[key, obj[key]]
또는를 사용Object.entries
@Pila 자신의 대답에 제안