【问题标题】:Iterate and search values in a object-literal having multiple levels在具有多个级别的对象文字中迭代和搜索值
【发布时间】:2012-12-24 07:53:17
【问题描述】:

这是我想做的:

  1. 我有一个具有多个级别的树(javascript 对象文字结构)。
  2. 我有这个对象的特定键的值。
  3. 我想在结构中搜索这个确切的键值对并返回另一个键的值作为输出。

为了清楚起见,下面是我的对象字面量:

{
"nodeId": 1081,
"appId": 150,
"displayText": "Welcome here",
"Nodes": [
    {
        "nodeId": 2000,
        "appId": 150,
        "displayText": "Buy",
        "parentNodeId": 1081,
        "Nodes": [
            {
                "nodeId": 2003,
                "appId": 150,
                "displayText": "tCars",
                "parentNodeId": 2000,
                "Nodes": [
                    {
                        "nodeId": 2006,
                        "appId": 150,
                        "displayText": "Diesel",
                        "parentNodeId": 2003,
                        "Nodes": [
                            {
                                "nodeId": 2008,
                                "appId": 150,
                                "displayText": "Price", //This is what I want as return value.
                                "parentNodeId": 2006,
                                "Nodes": [],
                                "nodeCode": "RN_1_1_2_1_3_2_4_1",
                                "parentCode": "RN_1_1_2_1_3_2",
                                "jumpToNode": "RN_1_1" //here is the value that I have with me.
                            }
                        ],
                        "nodeCode": "RN_1_1_2_1_3_2",
                        "parentCode": "RN_1_1_2_1"
                    }
                ],
                "concatWithHeader": false,
                "nodeCode": "RN_1_1_2_1",
                "parentCode": "RN_1_1"
            }
        ],
        "nodeCode": "RN_1_1",
        "parentCode": "RN"
    }
  ],
  "nodeCode": "RN",
  "parentCode": "ROOT_NODE"
}

2。我的价值是“RN_1_1”反对jumpToNode

3.我想在这个对象字面量中搜索并获取键 displayText

的值

我为此搜索并尝试了几件事,但无法获得迭代内部 Nodes 对象的逻辑。

到目前为止我写的方法:

function getObjects(tree){
var searchkey="RN_1_1";
var displayText = "displayText";
var nodeCode = "nodeCode";
var returnText;

if (tree.hasOwnProperty(nodeCode)) {
   var obj = tree[nodeCode];

   if(obj == searchkey){
    returnText = tree[displayText]; //gives me the return text
    break;
   }
   else{
    //here I should iterate over the inner `Nodes` and get the required value.
   }
}
}

请帮忙。

谢谢。

【问题讨论】:

    标签: javascript object-literal


    【解决方案1】:

    我认为你可以做这样的递归工作:

    function findProperty(obj, prop, val, propToFetch) {
        var answer;
        if (obj.hasOwnProperty(prop) && obj[prop] === val) {
            return obj[propToFetch];
        }
        for (var i = 0, len = obj.Nodes.length; i < len; i++) {
            answer = findProperty(obj.Nodes[i], prop, val, propToFetch);
            if (answer !== null) {return answer;}
        }
        return null;
    }
    
    var result = findProperty(data, "jumpToNode", "RN_1_1", "displayText");
    

    这里的工作演示:http://jsfiddle.net/jfriend00/EjC5V/

    【讨论】:

      【解决方案2】:

      根据您的 JSON 对象,您可以这样使用:

      var searchKey="RN_1_1",
      displayText = "displayText",
      nodeCode = "nodeCode",
      returnText,
      
      treeSearch = function (obj, searchKey) {
                    if (obj[nodeCode] === searchKey) {
                      returnText = obj[displayText];
                    } else {
                      if (obj['Nodes'][0]) {
                        treeSearch(obj['Nodes'][0], searchKey);
                      } else {
                        returnText = null
                      }
      
                    }
                  };
      
      treeSearch(JSONdata, 'RN_1_1_2_1_3_2');
      

      【讨论】:

      • 如果 Nodes 数组中有多个项目,这似乎不起作用。 OP 的 javascript 可能不会显示这种情况,但如果数组中没有提供多个对象,则没有理由将其作为数组。
      【解决方案3】:

      我已使用 nodeId 将数组展平,以便更轻松地搜索它。

      展平数组后,您可以根据需要对其进行过滤(我建议使用underscorejs.org

      这里是直播example。结果显示在控制台中。

        function flattenNodes (obj, newArr) {
          if (obj && obj.Nodes) {
              var nodes = obj.Nodes;
              delete(obj.Nodes);
              newArr[obj.nodeId] = obj;
              return flattenNodes(nodes.pop(), newArr);
          } else {
              return newArr;
          }
        };
        var flattenArr = flattenNodes(arr, new Array());
      
        function findInJumpToNode(find) {
            for(key in flattenArr) {
              if (flattenArr[key] && flattenArr[key]['jumpToNode']) {
                if (flattenArr[key]['jumpToNode'] == find) {
                  return flattenArr[key];
                }
              }
            }
        }
      
        var found = findInJumpToNode('RN_1_1');
        console.log(found);
      

      【讨论】:

        【解决方案4】:

        您可以使用递归来处理您的情况。 在 jsFiddle 上查看这个 sample

        var nodes= [getNodes()];  
        alert(getObjects(nodes));
        function getObjects(tree){    
        
        var searchkey="RN_1_1_2_1_3_2_4_1";
        var displayText = "displayText";
        var nodeCode = "nodeCode";
        var returnText;
        
        if(tree.length > 0)
        {    
            if(tree[0]["nodeCode"] === searchkey)
            {        
                return tree[0][displayText];        
            }
            if(typeof tree[0]["Nodes"] === "undefined")
            {
                return;
            }
            return getObjects(tree[0]["Nodes"]);
        }
        
        
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-11-09
          • 2015-09-01
          • 2017-11-06
          • 2017-10-02
          • 1970-01-01
          • 2013-02-21
          • 2020-10-16
          • 2019-06-30
          相关资源
          最近更新 更多