假设我有一个深度为N的对象:
A
我想在此对象中添加“水果”类别,但我必须搜索“植物”中的对象。然后添加它。所以我不想在一个声明中做:
Select HspId, CMSid, Cast(CMSId as nvarchar)
From Q2IMSSiteHistory2015old
inner Join HSP on CAST(HSP.CMSid as nvarchar) = Q2IMSSiteHistory2015old.POS
因为我想首先搜索它所属的位置。
如何在迭代过程中将水果类别添加到对象中?到目前为止我所拥有的是:
food = {
'Non-Animal': {
'Plants' : {
'Vegetables': {
...
}
},
'Minerals' : {
...
}
},
'Animal': {
...
}
}
如何修复此例程来执行此操作,还是有更好的方法来执行此操作?
答案 0 :(得分:1)
如果我正确地理解了您,我认为您希望您的函数定义一个可变参数,该参数采用您希望遍历并在必要时创建的路径的各个名称。
使用.reduce()
可以很容易。
const food = {
'Non-Animal': {
'Plants': {
'Vegetables': {}
},
'Minerals': {}
},
'Animal': {}
}
console.log(addCategory(food, "Non-Animal", "Plants", "Fruits"));
console.log(addCategory(food, "Non-Animal", "Minerals", "Gold"));
function addCategory(obj, ...path) {
return path.reduce((curr, name) => {
if (!curr) return null;
if (!curr[name]) return (curr[name] = {});
return curr[name];
// More terse but perhaps less readable
// return curr ? curr[name] ? curr[name] : (curr[name]={}) : null;
}, obj);
}
console.log(JSON.stringify(food, null, 2));

答案 1 :(得分:0)
看起来很好。但是,您可能希望在添加prop之后终止:
function addCategory(obj, category, parent_name) {
for (var key in obj) {
if (key == parent_name){
return obj[key][category] = {};
}
var p = obj[key];
if (typeof p === 'object') {
if(addCategory(p, category, parent)) return true;
}
}
}
答案 2 :(得分:0)
我只看到一个错误:addCategory的递归调用无法找到父变量,导致它在您的范围内被称为parent_name。
var food = {
'Non-Animal': {
'Plants' : {
'Vegetables': {
}
},
'Minerals' : {}
},
'Animal': {}
}
function addCategory(obj, category, parent_name) {
for (var key in obj) {
if (key == parent_name){
obj[key][category] = {};
}
var p = obj[key];
if (typeof p === 'object') {
addCategory(p, category, parent_name);
} else {
}
}
}
console.log(food);
addCategory(food, 'Fruits', 'Plants');
console.log(food);
答案 3 :(得分:0)
您可以使用reduce创建函数,该函数将键作为字符串和对象作为要分配给某个嵌套对象的值。
private static bool IsTextAllowed(string text)
{
return text.All(c => !char.IsWhiteSpace(c));
}