如何将这个嵌套对象转换为扁平对象?

对不起我不知道怎么用短语标题。 如果可能,请帮助编辑。

我有一个像这样的对象:

{ a: 'jack', b: { c: 'sparrow', d: { e: 'hahaha' } } } 

我想让它看起来像:

 { 'a': 'jack', 'b.c': 'sparrow', 'bde': 'hahaha' } // so that I can use it this way: a['bde'] 

jQuery也可以。 我知道对于嵌套对象,我可以使用abde来获取hahaha ,但今天我必须使用它像a['bde'] -_- !!! 我怎样才能做到这一点? 提前致谢 :)

您可以使用递归函数来抓取对象并为您展平它。

 var test = { a: 'jack', b: { c: 'sparrow', d: { e: 'hahaha' } } }; function dive(currentKey, into, target) { for (var i in into) { if (into.hasOwnProperty(i)) { var newKey = i; var newVal = into[i]; if (currentKey.length > 0) { newKey = currentKey + '.' + i; } if (typeof newVal === "object") { dive(newKey, newVal, target); } else { target[newKey] = newVal; } } } } function flatten(arr) { var newObj = {}; dive("", arr, newObj); return newObj; } var flattened = JSON.stringify(flatten(test)); alert(flattened); 

递归是这种情况的最佳解决方案。

 function flatten(input, reference, output) { output = output || {}; for (var key in input) { var value = input[key]; key = reference ? reference + '.' + key : key; if (typeof value === 'object' && value !== null) { flatten(value, key, output); } else { output[key] = value; } } return output; } var result = flatten({ a: 'jack', b: { c: 'sparrow', d: { e: 'hahaha' } } }); document.body.textContent = JSON.stringify(result); 

另一种递归实现。 我只想自己编写一个实现,即使当前的实现已经非常好。

递归函数检查密钥是否为'object'类型。

  • 如果它是一个对象,我们按每个对象的键进行迭代。
  • 否则,我们将它添加到我们的结果对象中。
 function flat(res, key, val, pre = '') { const prefix = [pre, key].filter(v => v).join('.'); return typeof val === 'object' ? Object.keys(val).reduce((prev, curr) => flat(prev, curr, val[curr], prefix), res) : Object.assign(res, { [prefix]: val}); } return Object.keys(input).reduce((prev, curr) => flat(prev, curr, input[curr]), {}); 

扁平NPM封装

或者你可以简单地使用扁平的npm包 ,这是一个众所周知的测试库。

 var flatten = require('flat') flatten(obj); 

⬑我会在严肃的代码中使用它。

[额外] Neater打电话给上面的function

 function flatObject(input) { function flat(res, key, val, pre = '') { const prefix = [pre, key].filter(v => v).join('.'); return typeof val === 'object' ? Object.keys(val).reduce((prev, curr) => flat(prev, curr, val[curr], prefix), res) : Object.assign(res, { [prefix]: val}); } return Object.keys(input).reduce((prev, curr) => flat(prev, curr, input[curr]), {}); } const result = flatObject(input); 

[额外]演示

http://codepen.io/zurfyx/pen/VpErja?editors=1010

 function flatObject(input) { function flat(res, key, val, pre = '') { const prefix = [pre, key].filter(v => v).join('.'); return typeof val === 'object' ? Object.keys(val).reduce((prev, curr) => flat(prev, curr, val[curr], prefix), res) : Object.assign(res, { [prefix]: val}); } return Object.keys(input).reduce((prev, curr) => flat(prev, curr, input[curr]), {}); } const result = flatObject({ a: 'jack', b: { c: 'sparrow', d: { e: 'hahaha' } } }); document.getElementById('code').innerHTML = JSON.stringify(result, null, 2); 
 

具有递归函数的aproach,对对象的键的迭代以及如果值是对象的查找。 如果是,请使用更新的function拨打电话。 否则将找到的值添加到结果对象。

 function getValues(o, a) { Object.keys(o).forEach(function (k) { if (typeof o[k] === 'object') { getValues(o[k], [].concat(a, k)); return; } result[[].concat(a, k).join('.')] = o[k]; }); } var object = { a: 'jack', b: { c: 'sparrow', d: { e: 'hahaha' } } }, result = {}; getValues(object); document.write('
' + JSON.stringify(result, 0, 4) + '

');

只是一个例子,您如何通过ES6function实现这一目标。

 const flatObject = obj => { const keys = Object.keys(obj) return keys.reduce((acc, k) => { const value = obj[k] return typeof value === 'object' ? {...acc, ...ObjectUtils.flatObject(value)} : {...acc, [k]: value} } , {}) } 

您不需要进行更改,您可以像JsonObject.bc一样访问它以从字段c获取数据。

看看这个http://www.mkyong.com/javascript/how-to-access-json-object-in-javascript/ 。