我想将一个像这样的对象转换:
{"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转换为键-值对数组?
我想将一个像这样的对象转换:
{"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转换为键-值对数组?
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((key) => [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}
var result = Object.entries(obj);
console.log(result);
如本示例所示,调用entries
将返回[key, value]
对,正如调用者要求的那样。
或者,您可以调用Object.values(obj)
,它将仅返回值。
Object.fromEntries()
可以将 [key, value]
键值对转换回对象。 - etoxin
Object.entries()
返回一个数组,其中的元素是与object
直接关联的可枚举属性[key, value]
对应的数组。属性的顺序与手动遍历对象属性值时给出的顺序相同。
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所提到的,map函数可以缩短为:
entry => [ +entry[0], entry[1] ]
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]]);
- Travis Clarke回顾一些关于 ES6 标准的答案。
从对象开始:
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/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map
let r=new Map(Object.entries(obj));
r.get("4"); //6
r.has(8); //true
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);
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.entries
对你不起作用,另一个解决方案是使用以下方法。
const obj = {
'1': 29,
'2': 42
};
const arr = Array.from(Object.keys(obj), k=>[`${k}`, obj[k]]);
console.log(arr);
使用 Object.entries
方法以 键 & 值
格式获取对象的每个元素,然后像这样通过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);
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.values([])
,如果您还没有,则可能需要使用此 polyfill:
const objectToValuesPolyfill = (object) => {
return Object.keys(object).map(key => object[key]);
};
Object.values = Object.values || objectToValuesPolyfill;
https://dev59.com/WVkS5IYBdhLWcg3wECuU#54822153
var object = {1: 'hello', 2: 'world'};
var array = Object.values(object);
请记住,在js中,数组只能使用数值键,因此如果您在对象中使用了其他内容,则这些内容将变为“0、1、2...x”。
例如,如果您有一个唯一的键,那么删除重复项可能会很有用。
var obj = {};
object[uniqueKey] = '...';
循环:
const array = _.values(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” }
]
NaN
。 如果你想使用字符串作为键,请将返回值从[Number(key), obj[key]]
更改为[key, obj[key]]
,或者按照@Pila在他们的答案中建议的那样使用Object.entries
。 - scottbot95