gpt4 book ai didi

javascript - 如何递归列出对象属性并将它们全部列在 'one-level-deep' 对象中?

转载 作者:行者123 更新时间:2023-11-28 00:18:16 25 4
gpt4 key购买 nike

我想要执行以下操作:从 JS 对象中,我想构建第二个对象,递归列出第一个对象中的所有属性,但全部位于“一级”,其名称是第一个对象内的“路径” .

这是一个例子。以下对象...

{
level1_simple: 'foo',
level1_object: {
level2_a: 'bar',
level2_b: 'bar2'
},
level1_array: [
{
property1: 'foobar',
property2: 'foobar2'
},
'element2'
]
}

应翻译为:

{
level1_simple: 'foo',

level1_object[level2_a]: 'bar',
level1_object[level2_b]: 'bar2',

level1_array[0][property1]: 'foobar',
level1_array[0][property2]: 'foobar2',
level1_array[1]: 'element2'
}

我编写了一个递归函数,除了以下两个我无法解决的问题之外,该函数运行良好:

  1. 字符串被解析为字符数组而不是字符串
  2. 我不知道如何检测“叶子”属性(终止条件),因为每个属性似乎总是​​有一个“0”属性,它本身也有一个“0”属性,等等.

这里是完整的代码(由于上面的第 2 点,导致无限循环):

function _treatDataRecursive( data, newData, prefix )
{
console.log( 'Entering: ' + prefix +"\n" );

// Iterate over the properties of data
for( property in data )
{
console.log( 'Listing properties: ' + property + " value = " + data[property] + "\n" );
// Build property symfonyzed name (using recursion)
var newPropName = prefix + '[' + property + ']';
// Check if property is a leaf
var type = typeof property;
if( type === 'string' || type === 'number' || type === 'boolean' )
{
console.log( 'Property is a leaf: ' + property +"\n" );
// Property is a leaf: add property/value to newData
newData[newPropName] = data[property];
} else {
// Recursive call to go one level deeper
_treatDataRecursive( property, newData, newPropName );
}
}
}

最佳答案

你只有一个大问题。您应该使用属性的实际值,而不是属性本身。

function _treatDataRecursive(data, newData, prefix) {
for (var property in data) {
// if prefix is empty, don't decorate the property
var newPropName = prefix ? prefix + '[' + property + ']' : property;
// get the type of the actual value, not the `property`
var type = typeof data[property];

// If it is an object and not null do the recursion
if (type === 'object' && data[property] !== null) {
_treatDataRecursive(data[property], newData, newPropName);
} else {
// Most likely a leaf, don't recurse now
newData[newPropName] = data[property];
}
}
}

var obj = {};
_treatDataRecursive(data, obj, "");
console.log(obj);

输出

{ level1_simple: 'foo',
'level1_object[level2_a]': 'bar',
'level1_object[level2_b]': 'bar2',
'level1_array[0][property1]': 'foobar',
'level1_array[0][property2]': 'foobar2',
'level1_array[1]': 'element2' }

关于javascript - 如何递归列出对象属性并将它们全部列在 'one-level-deep' 对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30266657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com