Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按键顺序筛选json对象_Javascript_Json - Fatal编程技术网

Javascript 按键顺序筛选json对象

Javascript 按键顺序筛选json对象,javascript,json,Javascript,Json,我试图根据用户输入按键过滤嵌套的json对象,但键的数量可以是完全动态的。我还需要根据索引/深度进行搜索 例如,如果您使用此json: values = { 1: { 4: { 9: { ... }, 10: { ... } }, 7: { 12: { ... }, 15: { ... },

我试图根据用户输入按键过滤嵌套的json对象,但键的数量可以是完全动态的。我还需要根据索引/深度进行搜索

例如,如果您使用此json:

values = {
  1: {
    4: {
      9: {
         ...
      },
      10: {
         ...
      }
    },
    7: {
      12: {
         ...
      },
      15: {
         ...
      },
      18: {
         ...
      }
    }
  },
  2: {
    5: {
      7: {
         ...
      }
    }
  }
}
我希望得到以下结果:

search = [1]

result:
{
  1: {
    4: {
      9: {
         ...
      },
      10: {
         ...
      }
    },
    7: {
      12: {
         ...
      }
      15: {
         ...
      }
      18: {
         ...
      }
    }
  }
}

search = [1, 4]

result:
{   
    4: {
        9: {
          ...
        },
        10: {
          ...
        }
    }
}


search = [1, 4, 9]

result:

{ 
  9: {
      ...
  }
}


search = [2, 5]

result:
{   
    5: {
       7: {
          ...
       }
    }
}
我最初认为我可以直接使用
result=values[2][5]
,但由于键和json在内容和深度上都是完全动态的,所以它不起作用

我尝试过使用过滤器,但它只在一个级别上起作用,因为我需要先知道前面的X个键

有人有什么想法吗

编辑


这被标记为这篇文章的副本,但这与我没有搜索整个对象以获得该键的第一个结果并不完全相同。键并不总是唯一的,例如,它们可能位于整个对象的其他位置,因此我需要按顺序遍历对象。

对于JSON,您仍然可以使用数组。如果您想按索引进行选择,那么必须像这样编写JSON

[
  [
    { 'key' : 'value' },
    { 'key' : 'value' }
  ],
  [
    { 'key' : 'value' },
    { 'key' : 'value' }
  ]
],
[ ... ],
[ ... ]
假设JavaScript随后将此JSON分配给
常量值
,那么您就可以使用语法
值[0][1]
访问这些对象中的任何一个。这样,您就不必做任何额外的工作来使索引成为动态的,因为这是它们的标准行为

就动态深度而言,您可以使用handy编写一个简短的函数

或ES5,如果您愿意:

var search = function(searchArr, idxArr) {
  var result = searchArr;
  var exists = function() {
    return idxArr.every(function (idx) {
      return result = result[idx];
    });
  };
  return exists() ? result : null;
};

查看上的示例。

result={5:values[2][5]}?编写一个可以搜索单个键的函数。然后在输入数组上循环,根据上一次调用的结果调用它。当结果以
5:
开头时,这意味着什么?这不是有效的Javascript语法,它需要位于对象内部,例如
{5:…}
?@solarc,如果
2
嵌套得更深入,则该语法将不起作用。你能发布你的尝试吗?我想你不明白这个问题。这是关于如何在对象中任意深度搜索一个键。是的,这不太正确,我不能更改jsonanyway@Onfire这是不是有点像你问的?
var search = function(searchArr, idxArr) {
  var result = searchArr;
  var exists = function() {
    return idxArr.every(function (idx) {
      return result = result[idx];
    });
  };
  return exists() ? result : null;
};