Javascript 如何选择JSON中存在的几个项目中的第一个?

Javascript 如何选择JSON中存在的几个项目中的第一个?,javascript,json,Javascript,Json,JSON文件是由一系列密钥和值组成的。我知道给定JSON中的潜在键,但不知道它们是否具有相应的非空值。我已经将JSON文件加载到一个名为JSON的对象中。我想找到具有值的几个可能键中的第一个,然后将该值分配给变量。当我说“first”时,我指的是根据与JSON结构无关的优先级列表的“first”: 我可以做到以下几点,而且效果很好: if(json.age) myValue = json.age; else if(json.classYear) myValue = json.cl

JSON文件是由一系列密钥和值组成的。我知道给定JSON中的潜在键,但不知道它们是否具有相应的非空值。我已经将JSON文件加载到一个名为JSON的对象中。我想找到具有值的几个可能键中的第一个,然后将该值分配给变量。当我说“first”时,我指的是根据与JSON结构无关的优先级列表的“first”:

我可以做到以下几点,而且效果很好:

if(json.age)
    myValue = json.age;
else if(json.classYear)
    myValue = json.classYear;
else if(json.seniority)
    myValue = json.seniority
else
    myValue = false;
这是可行的,但有几个原因很糟糕:

  • 写起来很慢
  • 在每行中重写键值名称两次是很烦人的
  • 这有点难读
  • 很难用程序来推理。我没有一个用例需要这样做,但我可以想象,想要在我的代码中任意更改优先级顺序
  • 虽然处理速度不算太慢,但我可以想象其他方法可能会计算得更快
  • 这些原因使我相信上面列出的方法并不理想。还有其他更好的模式吗

    (注意:我认识到这个问题接近于“如何最好”而不是“如何”的措辞。我知道SO对这类问题并不疯狂,我并不想让人这样理解我的问题。相反,我的问题应该被解释为提问,“是否有一些设计模式特别适合上述问题?”

    (注意:我只接受一个普通的答案,但如果您认为其他答案会有帮助,请随时提供其他答案)。

    您可以使用。您仍然需要写出所有的属性名称,但我不确定是否有办法不这样做就完成此任务

    const myValue = json.age || json.classYear || json.senority || false;
    
    你可以用。您仍然需要写出所有的属性名称,但我不确定是否有办法不这样做就完成此任务

    const myValue = json.age || json.classYear || json.senority || false;
    

    如果您可以使用一点
    JQuery
    ,那么我想下面的代码片段应该可以完成这项工作

    $.each(JSONObj, function(key, value){
        if (!(value === "" || value === null)){
            myValue = value;
            return false; //to break the loop once a valid value is found
        }
    });
    

    这将为变量
    myValue
    分配第一个有效值,并在找到有效值后退出循环。

    如果您对使用一点
    JQuery
    没问题,那么我想下面的代码片段应该可以完成这项工作

    $.each(JSONObj, function(key, value){
        if (!(value === "" || value === null)){
            myValue = value;
            return false; //to break the loop once a valid value is found
        }
    });
    

    这将为变量
    myValue
    分配第一个有效值,并在找到有效值后退出循环。

    好的,因此如果您有一个一维哈希表和一个键优先级数组,那么您可以使用类似这样的算法来选择第一个可用值:

    function grab(hash, keyPriority) {
      var value;
      keyPriority.some(function (key) {
        if (hash.hasOwnProperty(key)) { // check if the property exists
          value = hash[key];
          return true; // break out of loop
        }
      });
      return value;
    }
    
    用法:

    grab({ c: 3, d: 4 }, ['a', 'b', 'c', 'd']) // 3
    

    您可以通过truthy值来修改它,或者通过将
    hash.hasOwnProperty(key)
    更改为
    hash[key]
    hash[key]!=空值。

    好的,如果您有一个一维哈希表和一个键优先级数组,那么您可以使用如下算法选择第一个可用的:

    function grab(hash, keyPriority) {
      var value;
      keyPriority.some(function (key) {
        if (hash.hasOwnProperty(key)) { // check if the property exists
          value = hash[key];
          return true; // break out of loop
        }
      });
      return value;
    }
    
    用法:

    grab({ c: 3, d: 4 }, ['a', 'b', 'c', 'd']) // 3
    

    您可以通过truthy值来修改它,或者通过将
    hash.hasOwnProperty(key)
    更改为
    hash[key]
    hash[key]!=分别为空。

    并且我将修复您的财产名称的拼写。“资历”!=“女士:)这正是我这么做的原因。非常感谢。请注意,如果任何属性的值可以合法地为
    0
    或空字符串(或其他错误值),那么这将不会给出正确的结果。感谢您提供有助于了解nnnnn的注释,为什么这需要是常量?为什么您不能只使用变量执行此操作?我将修复属性名称的拼写。“资历”!=“女士:)这正是我这么做的原因。非常感谢。请注意,如果任何属性的值可以合法地为
    0
    或空字符串(或其他错误值),则这将不会给出正确的结果。感谢您提供有助于了解nnnnn的说明。为什么这需要是一个常量?为什么不能仅使用变量执行此操作?这行不通,因为它没有按照所需的特定顺序测试属性(正如OP所说,这不一定与原始JSON结构的顺序相关(对象属性也没有像数组元素那样的固有顺序))。这不起作用,因为它没有按照所需的特定顺序测试属性(正如OP所说,这不一定与原始JSON结构的顺序有关(对象属性也不像数组元素那样具有固有的顺序)。