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

时间:2016-12-20 03:27:38

标签: javascript json

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

我可以做以下工作:

if(json.age)
    myValue = json.age;
else if(json.classYear)
    myValue = json.classYear;
else if(json.seniority)
    myValue = json.seniority
else
    myValue = false;

这很有效但有几个原因:

  1. 写作很慢
  2. 每行两次重写键值名称很烦人
  3. 有点难以阅读
  4. 以编程方式推理非常困难。我没有需要这个的用例,但我可以想象想在我的代码中任意改变优先级顺序。
  5. 虽然处理速度不是很慢,但我可以想象其他一些方法的计算速度可能会更快。
  6. 这些原因让我相信上面列出的方法并不理想。还有其他一些模式会更好吗?

    (注意:我认识到这个问题与“如何做到最好”相对,而不是“如何”措辞。我知道这个问题并不是很疯狂,我并不是说我的问题需要解释相反,我的问题应该被解释为问:“是否有一些特别适合上述问题的设计模式?”

    (注意:我只接受一个香草答案,但如果你认为他们会有所帮助,请随时提供其他答案。)

3 个答案:

答案 0 :(得分:4)

您可以使用short-circuit evaluation。你仍然需要写出所有的属性名称,但我不确定有没有办法完成这项任务而不这样做。

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

答案 1 :(得分:2)

好的,所以如果你有一维哈希表和一个关键优先级的数组,那么你可以使用这样的算法来选择第一个可用的算法:

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] != null来修改未定义/ null。

答案 2 :(得分:0)

如果您使用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,并且一旦找到有效值,也会退出循环。