Javascript - 遍历树状对象并添加密钥

时间:2017-08-24 15:42:21

标签: javascript object

假设我有一个深度为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': {
        ...
    }
}

如何修复此例程来执行此操作,还是有更好的方法来执行此操作?

4 个答案:

答案 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));
}

相关问题