Javascript Nested Literal to string

时间:2014-05-16 00:01:55

标签: javascript arrays join recursion

我正在寻找一种技术来运行嵌套属性的对象,并希望加入属性'。

这是我想加入的对象:

var array = {
  prop1: {
    foo: function() {
      // Your code here
    }
  },
  prop2: {
    bar1: 'some value',
    bar2: 'some other value'
  }
};

结果应如下所示:

[
  [ 'prop1', 'foo' ],
  [ 'prop2', 'bar1' ],
  [ 'prop2', 'bar2' ]
]

然后我想将数组加入到这样格式化的字符串中:

prop1.foo
prop2.bar1
prop2.bar2

任何提示?

编辑:忘了说它应该适用于更深层的数组。

2 个答案:

答案 0 :(得分:0)

这是一个完全不同的问题,因为你已经指定它需要支持任意深度。为了解决这个问题,我们需要使用递归,我们需要使用第二个递归参数来跟踪我们在嵌套层次结构中的位置。

function objectPropertiesToArrays(obj, prepend) {
  // result will store the final list of arrays
  var result = [];

  // test to see if this is a valid object (code defensively)
  if(obj != null && obj.constructor === Object) {
    for (var propertyName in obj) {
      var property = obj[propertyName],
          // clone prepend instantiate a new array
          list = (prepend || []).slice(0);

      // add the property name to the list
      list.push(propertyName);

      // if it isn't a nested object, we're done
      if (property.constructor !== Object) {
        result.push(list);

      // if it is a nested object, recurse
      } else {
        // recurse and append the resulting arrays to our list
        result = result.concat(objectPropertiesToArrays(property, list));
      }
    }  
  }    

  return result;
}

示例:

var obj = {  
  prop1: {
    foo: function() { }
  },
  prop2: {
    bar1: 'some value',
    bar2: 'some other value'
  },
  prop3: {
    x: {
      y: [],
      z: 'test'
    },
    erg: 'yar'
  }
};

objectPropertiesToArrays(obj);

返回

[
  ["prop1", "foo"],
  ["prop2", "bar1"],
  ["prop2", "bar2"],
  ["prop3", "x", "y"],
  ["prop3", "x", "z"],
  ["prop3", "erg"]
]

答案 1 :(得分:0)

沿着这些方向的东西? http://jsfiddle.net/X2X2b/

var array = {
  prop1: {
    foo: function() {
      // Your code here
    }
  },
  prop2: {
    bar1: 'some value',
    bar2: 'some other value'
  }
};

var newA = [],
    newB = [];
for  ( var obj in array ) {
    for  (var inObj in array[obj]) {
        newA.push([obj, inObj]);
        newB.push(obj + '.' + inObj);
    }
}

console.log(newA);
console.log(newB);