将对象展平为数组?

时间:2011-10-05 11:46:22

标签: javascript

我正在使用一个对象作为哈希表。我想快速打印出其内容(例如alert())。是否内置了将哈希转换为(键,值)对的数组?

7 个答案:

答案 0 :(得分:7)

由于您想要alert,我认为它不适用于您的生产版本,并且旧的浏览器兼容性不是问题。

如果是这种情况,那么你可以这样做:

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

答案 1 :(得分:4)

我更新了一些。这甚至比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
    }
}

我唯一能做的就是根据递归级别正确缩进。

答案 2 :(得分:2)

快速&amp;您可以alert使用JSON中的脏使用:

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

答案 3 :(得分:1)

不是我知道的。不过,你可以自己相当简洁地做到这一点:

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

但是,再次,ew。

答案 4 :(得分:1)

这是我的版本。它应该允许你压缩输入,如下所示:

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 = []

展平(输入,输出);

然后输出应该是扁平数组。

答案 5 :(得分:1)

也许有点晚了,但在这里你有我的答案版本,更新到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] }`;
  }));
}

因此,更改最后一个返回值可以格式化数组中的元素。

答案 6 :(得分:0)

使用for循环:

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