gpt4 book ai didi

javascript - 将 n 层嵌套对象转换为数组

转载 作者:行者123 更新时间:2023-11-28 07:43:03 25 4
gpt4 key购买 nike

我有一个嵌套对象,与此类似:

var obj = {
"prop1": {
"prop1A": "A",
"prop1B": {
"prop1BA": "BA"
},
"prop1C": "C"
}
};

我的最终目标是根据另一个架构对象将此对象过滤到特定的预定义键,例如:

var filterSchema = {
"prop1":["prop1A", {"prop1B":["prop1BA"]}]
};

(过滤器键是预定义的,如果您有更好的想法,我可以以不同的方式构造该对象......

输出应该是一个数组。在我们的例子中:

["A","BA"]

我设法使用对象的递归来做到这一点。我想知道是否有更优雅的方法来实现这一点(尝试使用 jQuery 的映射/扩展,但没有成功)

编辑我知道这是一个“N”级问题,应该通过递归来解决。这里的区别是我有预定义的过滤器,它已经有“N”个级别。所以我想也许我可以使用过滤器数组过滤 Objet,然后将其转换为数组。

编辑2谢谢大家的不同回答。这是我自己的问题解决方案(我一开始就在寻找更优雅的解决方案): My solution

            var obj = {
"prop1": {
"prop1A": "A",
//"prop1B": {
// "prop1BA": "BA"
//},
"prop1C": "C",
"prop1D": "D",
"prop1E": {"prop1E1": "444"}
},
"prop2": "12345"
};


var schemaObj = {
"prop1": {
"prop1A": "true",
"prop1B": {
"prop1BA": "true"
},
"prop1C": "true"
},
"prop2": "true"
};

var resultsArray = [];
var keys = Object.keys(schemaObj);
for(var i=0;i<keys.length;i++){
if(obj[keys[i]]){
parser(schemaObj[keys[i]], obj[keys[i]]);
}
}


function parser(v,o){
if( typeof v === "string" ){
resultsArray.push(o);
}
else{
var keys2 = Object.keys(v);
for(var j=0;j<keys2.length;j++){
if(o[keys2[j]]){
parser(v[keys2[j]], o[keys2[j]]);
}
}
}
}

console.log(resultsArray);

只是提醒一下这个问题 - 我已经有了递归解决方案。我正在寻找不同的解决方案

最佳答案

Javascript 有 eval,允许您在运行时创建新代码。一个可能的解决方案是仅使用一次递归来创建一个如下所示的字符串:

code = "[obj.prop1.prop1A, obj.prop1.prop1B.prop1BA]"

然后你可以创建一个数据转换函数

f = eval("function(obj){return " + code + "]}")

并将其与 f(x) 一起使用来获取数组。

如果您必须多次提取数据,这也是最有效的解决方案。

例如:

function mkFilter(schema) {
var parts = [];
function xtract(s, prefix) {
if (typeof s === "string") {
parts.push(prefix + s);
} else if (s && s.constructor === Array) {
s.forEach(function(x){ xtract(x, prefix); });
} else {
for (var f in s) {
xtract(s[f], prefix + f + ".");
}
}
}
xtract(schema, "obj.");
var code = "(function(obj){ return [" + parts.join(", ") + "]; })";
return eval(code);
}

传递schemaFilter作为参数mkFilter将返回一个给定对象返回数组的函数;与您的输入:

console.log(mkFilter(filterSchema)(obj));

显示['A', 'BA']。当然,如果您需要对不同的对象多次重复使用相同的过滤器,那么这种方法是有意义的。

如果对象可能缺少部分,并且您不希望过滤器失败,而只是数组中的 未定义 值,则需要稍微更改代码生成器:

var code = "(function(obj){ return [";
parts.forEach(function(p){
var chain = p.split(".");
var expr = "";
for (var i=0; i<chain.length-1; i++) {
expr += chain.slice(0, i+1).join(".") + " && ";
}
code += expr + p + ",";
});
code += "]; })";

这将在您的示例中创建一个评估过滤器

(function(obj){
return [obj && obj.prop1 && obj.prop1.prop1A,
obj && obj.prop1 && obj.prop1.prop1B &&
obj.prop1.prop1B.prop1BA,];
})

关于javascript - 将 n 层嵌套对象转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27787453/

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