Flatten object to array?

匿名 (未验证) 提交于 2019-12-03 08:48:34

问题:

I'm using an object as a hash table. I'd like to quickly print out its contents (for alert() for instance). Is there anything built in to convert a hash into arrays of (key, value) pairs?

回答1:

Since you want to alert it out I assume it's not for your production version, and that old browser compatibility is not an issue.

If this is the case, then you can do this:

var myHash = ...... alert(Object.keys(myHash).map(function(key) { return [key, myHash[key]]; }));


回答2:

I updated this some more. This is much easier to parse than even console.log because it leaves out the extra stuff that's in there like __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     } }

The only thing I would do to improve this is have it indent correctly based on recursion level.



回答3:

Not that I'm aware of. Still, you can do it yourself fairly concisely:

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 }]

Of course, you can't alert this either, so you might as well just console.log(obj) in the first place.


You could output arrays of arrays:

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

But, again, ew.



回答4:

for quick & dirty use in alert you could use JSON:

alert(JSON.stringify(yourObj).replace(/,/g,'\n'));


回答5:

Here is my version of it. It should allow you to flatten input like below:

var input = {    a: 'asdf',    b: [1,2,3],    c: [[1,2],[3,4]],    d: {subA: [1,2]} }

The function is like this:

    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);     }

Usage is something like:

var output = []

flatten(input, output);

Then output should be the flattened array.



回答6:

Use the for loop:

for (var x in yourObj) {     alert(yourObj[x]); }


回答7:

Maybe a little late, but here you have my version of the answer, updated to ES2015. I use a recursive function and it works even if there are other objects inside the main object:

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] }`;   })); }

So changing the last return you can format the element inside your array.



转载请标明出处:Flatten object to array?
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!