我想像这样转换一个对象:
{"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中的键值对数组?
当前回答
使用lodash,除了上面提供的答案外,还可以将键放在输出数组中。
输出数组中没有对象键
for:
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] = '...';
object. entries()返回一个数组,其元素对应于直接在object上找到的可枚举属性[key, value]对。属性的顺序与手动遍历对象的属性值所给出的顺序相同。 ——https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries描述
对象。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 ={“2”,“1”:5: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); 返回条目。map(entry =>对象。赋值(条目,{0:+条目[0]}); } console.log (toNumericPairs (obj));
我使用一个箭头函数和对象。在上面的例子中为map回调函数赋值,这样我就可以利用Object. assign这一事实将它保存在一条指令中。Assign返回被赋值的对象,单个指令箭头函数的返回值就是该指令的结果。
这相当于:
entry => {
entry[0] = +entry[0];
return entry;
}
正如@TravisClarke在评论中提到的,地图功能可以缩短为:
entry => [ +entry[0], entry[1] ]
但是,这将为每个键-值对创建一个新数组,而不是就地修改现有数组,从而使创建的键-值对数组的数量增加一倍。虽然原始条目数组仍然是可访问的,但它及其条目将不会被垃圾收集。
现在,尽管使用我们的in-place方法仍然使用两个数组来保存键-值对(输入数组和输出数组),但数组的总数只改变了一个。输入和输出数组实际上并不是由数组填充的,而是对数组的引用,而这些引用在内存中所占的空间可以忽略不计。
就地修改每个键-值对只会增加很少的内存,但是需要多输入几个字符。 为每个键-值对创建一个新数组会使所需的内存增加一倍,但需要输入的字符会减少一些。
你可以更进一步,通过就地修改entries数组而不是将其映射到一个新的数组来消除增长:
const obj ={“2”,“1”:5: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); 条目。forEach(entry => entry[0] = +entry[0]); 返回条目; } console.log (toNumericPairs (obj));
我们可以将数字改为字符串类型的键如下所示:
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) { 返回 [字符串(键), 对象[键]]; }); 控制台.log(结果);
在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);
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); 游戏机。log (res);
在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属性作为新数组的键(可以创建稀疏数组):
几点obj ={1: 9、“2”:8、“3”:7、“4”:6:5,“6”4、“7”:3、“8”2、“9”:1、“10”:0 12:5); 控制台日志对象。。(obj)。减少(这是[k, v) = > [k] = v,(这个),[]); - [undefined, 9,8,7,6,5,4,3,2,1,0 undefined,章5段]
最后一个方法,它还可以根据键的值重新组织数组的顺序。有时这可能是期望的行为(有时不是)。但是现在的优点是值在正确的数组槽上建立索引,这对于在它上进行搜索至关重要。
用Map代替Array
最后(不是最初问题的一部分,但为了完整性),如果你需要使用键或值轻松搜索,但你不想要稀疏数组,没有重复,没有重新排序,而不需要转换为数字键(甚至可以访问非常复杂的键),那么数组(或对象)不是你需要的。我推荐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