获取属性的分层映射并在javascript中将其转换为单个映射的函数

时间:2016-07-11 04:53:04

标签: javascript

我有一个函数只有一个变量(foo),那就是:

{
  'a': {
    'b': {
      'c': 12,
      'd': 'Hello World'
    },
    'e': [1,2,3]
  }
}

现在我需要将其转换为:

{
  'a/b/c': 12,
  'a/b/d': 'Hello World',
  'a/e': [1,2,3]
}

包括所有属性类型,如函数,true或false,数组,数字,字符串等。

注意:请不要编写实现此目的的代码段,也不要将其提供给我。请给我一些关于我应该使用什么以及算法是什么的提示。然后,如果我无法编写代码,我会告诉您给我代码。

由于

3 个答案:

答案 0 :(得分:2)

我会采用递归方法,其中单个调用迭代属性并将键放入数组中,如果值是对象,我将使用实际值再次调用该函数,并使用访问键调用该数组。



function flatKeys(object) {

    function iter(part, keys) {
        Object.keys(part).forEach(function (k) {
            if (part[k] !== null && !Array.isArray(part[k]) && typeof part[k] === 'object') {
                return iter(part[k], keys.concat(k));
            }
            flat[keys.concat(k).join('/')] = part[k];
        });
    }

    var flat = {};
    iter(object, []);
    return flat;
}

var object = { a: { b: { c: 12, d: 'Hello World' }, e: [1, 2, 3] } };

console.log(flatKeys(object));




答案 1 :(得分:1)

未经测试的代码,但应该让你去

function flatten(obj) {
  var retVal = {};

  traverse(obj, '');

  return retVal;

  function traverse(obj, path) {
    for (prop in obj) {
      if (obj[prop] && typeof(obj[prop]) === 'object')
        traverse(obj[prop], path ? path + '/' + prop : prop);
      else
        retVal[path ? path + '/' + prop : prop] = obj[prop];
    }
  };
}

var obj = {
  a: {
    b: {
      c: 12,
      d: 'Hello World'
    },
    e: [1,2,3]
  }
};
var result = flatten(obj);
result = JSON.stringify(result, null, 2);

$("#result").text(result);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<pre id="result"></pre>

答案 2 :(得分:0)

循环遍历对象的每个键也应该有效。

检查以下代码,以便您可以修改它以满足您的需求

var obj = {
  'a': {
    'b': {
      'c': 12,
      'd': 'Hello World'
    },
    'e': [1,2,3]
  }
};
var newObj = {};
var temp = ''

var objectLooper = function(obj, removeParent, parent) {


var objKeys = Object.keys(obj);

for (var i = 0; i< objKeys.length; i++) {
console.log(typeof obj[objKeys[i]])
if (typeof obj[objKeys[i]] === 'object' && typeof obj[objKeys[i]].length === 'undefined'){
//loop again

temp += temp.length > 0 ? '/' + objKeys[i] :  objKeys[i];

objectLooper(obj[objKeys[i]], true, objKeys[i])
}else {
//temp += temp.length > 0 ?  :  objKeys[i];
newObj[temp +'/' + objKeys[i]] = obj[objKeys[i]]
}
}
if(removeParent === true) {
temp = temp.split('/' +parent).join()
}
}

objectLooper(obj)
newObj;