将对象扁平化为数组
Flatten object to array?
我使用一个对象作为哈希表。我想快速打印出它的内容(例如alert()
)。是否有任何内置的东西将哈希转换为(键,值)对的数组?
既然你想要alert
它出来,我认为这不是你的生产版本,旧的浏览器兼容性不是一个问题。
如果是这种情况,那么你可以这样做:
var myHash = ......
alert(Object.keys(myHash).map(function(key) { return [key, myHash[key]]; }));
我更新了一些。这比console.log更容易解析,因为它省去了额外的东西,比如__proto__
。
function flatten(obj) {
var empty = true;
if (obj instanceof Array) {
str = '[';
empty = true;
for (var i=0;i<obj.length;i++) {
empty = false;
str += flatten(obj[i])+', ';
}
return (empty?str:str.slice(0,-2))+']';
} else if (obj instanceof Object) {
str = '{';
empty = true;
for (i in obj) {
empty = false;
str += i+'->'+flatten(obj[i])+', ';
}
return (empty?str:str.slice(0,-2))+'}';
} else {
return obj; // not an obj, don't stringify me
}
}
我要做的唯一一件事就是让它根据递归级别正确缩进。
;在alert
中,您可以使用JSON
:
alert(JSON.stringify(yourObj).replace(/,/g,''n'));
我不知道。不过,您自己也可以做得相当简洁:
var obj = { a: 1, b: 2, c: 3 };
var arr = [];
for (var i in obj) {
var e = {};
e[i] = obj[i];
arr.push(e);
}
console.log(arr);
// Output: [Object { a=1 }, Object { b=2 }, Object { c=3 }]
当然,你也不能alert
这个,所以你最好在第一个地方就console.log(obj)
。
可以输出数组的数组:
var obj = { a: 1, b: 2, c: 3 };
var arr = [];
for (var i in obj) {
arr.push([i, obj[i]]);
}
console.log(arr);
// Output: [["a", 1], ["b", 2], ["c", 3]]
alert(arr);
// Alert: a, 1, b, 2, c, 3
这是我的版本。它应该允许你像下面这样平化输入:
var input = {
a: 'asdf',
b: [1,2,3],
c: [[1,2],[3,4]],
d: {subA: [1,2]}
}
函数如下:
function flatten (input, output) {
if (isArray(input)) {
for(var index = 0, length = input.length; index < length; index++){
flatten(input[index], output);
}
}
else if (isObject(input)) {
for(var item in input){
if(input.hasOwnProperty(item)){
flatten(input[item], output);
}
}
}
else {
return output.push(input);
}
};
function isArray(obj) {
return Array.isArray(obj) || obj.toString() === '[object Array]';
}
function isObject(obj) {
return obj === Object(obj);
}
用法类似于:
var output = []
平(输入、输出);
那么输出应该是扁平的数组
可能有点晚,但这里你有我的版本的答案,更新到ES2015。我使用递归函数,即使主对象中有其他对象,它也能工作:
function objectFlattener (object) {
return Reflect.apply(Array.prototype.concat, [], Object.keys(object).map(key => {
if (object[key] instanceof Object) {
return objectFlattener(object[key]);
}
return `${ key }: ${ object[key] }`;
}));
}
所以改变最后的返回值你可以格式化数组中的元素
使用for循环:
for (var x in yourObj)
{
alert(yourObj[x]);
}
相关文章:
- jQuery Ajax数组序列化错误
- JavaScript 数组使用 if 语句扁平化
- 使用 LoDash 或类似方法规范化/扁平化 JS 数组
- 如何使 Javascript 数组全局化
- JavaScript 数组序列化
- 用数组初始化对象,Javascript
- 扁平化多个嵌套数组的数组而不带递归 - javascript
- Javascript多维数组初始化
- Javascript 数组初始化行为
- Javascript二维数组初始化
- 用于php的Javascript数组序列化函数
- 扁平化数组元素(不是整个数组)的有效方法JavaScript
- 使用javascript将一个对象数组扁平化为另一个对象数组
- ajax调用中错误的javascript数组序列化
- Javascript:不能用函数数组初始化对象属性
- 修复javascript数组初始化
- 数组初始化问题
- 有没有一种简单的方法可以使嵌套数组扁平化
- 使用多维数组字符串化给出空结果
- Javascript对象数组初始化器格式