3

这是我想做的事情:

  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.
   }
}
}

请帮忙。

谢谢。

4

4 回答 4

2

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

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/

于 2012-12-24T08:27:14.837 回答
1

根据您的 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');
于 2012-12-24T08:54:01.913 回答
0

我已经使用 nodeId 展平了数组,以便更容易地搜索它。

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

这是现场示例。结果显示在控制台中。

  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);
于 2012-12-24T08:58:48.893 回答
0

您可以使用递归来处理您的情况。在 jsFiddle 上查看此示例。

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"]);
}



}
于 2012-12-24T09:20:21.967 回答