如何检测多级对象是否具有undefined或null属性?

时间:2016-11-18 10:05:15

标签: javascript lodash

在我的代码中的许多地方,我都有类似下面的检查。它非常冗长,丑陋。有更好的方法吗?仅供参考,我在所有项目中使用Lodash,因此我可以访问该强大的库。

/*
(Current time) Listing 2.7, ShowCurrentTime.java, gives a program that displays
the current time in GMT. Revise the program so that it prompts the user to enter
the time zone offset to GMT and displays the time in the specified time zone.
*/


import java.util.Scanner;

public class Ex_03_08 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

         System.out.print("Enter the time zone (GMT): ");
        int gmt = input.nextInt();

         long totalMilliseconds = System.currentTimeMillis();

         long totalSeconds = totalMilliseconds / 1000;

         long currentSecond = totalSeconds % 60;

         long totalMinutes = totalSeconds / 60;

         long currentMinute = totalMinutes % 60;

         long totalHours = totalMinutes / 60;

         long currentHour = totalHours % 24;
        currentHour = currentHour + gmt;

         System.out.println("The current time is " + currentHour + ":"
                + currentMinute + ":" + currentSecond);

        input.close();
    }
}

5 个答案:

答案 0 :(得分:2)

由于您使用lodash,因此可以使用has方法:

_.has(obj,[orderId, 'report', categoryProductCode, 'categories', comment.categoryId])

https://lodash.com/docs/4.16.6#has

get方法获取对象路径的值:https://lodash.com/docs/4.16.6#get

答案 1 :(得分:0)

不优雅的方式,但你可以包装在try catch

var result;
    try{
    result = myAssessments[orderId].report[categoryProductCode].categories[comment.categoryId]
    }catch{}

if (result){
  // do it
}

答案 2 :(得分:0)

使用内置的isset函数:

if (isset(myAssessments[orderId].report) &&
    isset(myAssessments[orderId].report[categoryProductCode]) &&
    isset(myAssessments[orderId].report[categoryProductCode].categories) &&
    isset(myAssessments[orderId].report[categoryProductCode].categories[comment.categoryId)]) {

答案 3 :(得分:0)

您可以使用包含所有属性的数组进行检查和迭代,直到检查完所有属性。

localhost

答案 4 :(得分:0)

我有这个genric功能

function chckForKeyPresence(data, arr, checkLength){
    var currData = data;
    for(var i=0; i<arr.length; i++){
        if(!currData.hasOwnProperty(arr[i]))
            return false;

        currData = currData[arr[i]];
    }

    if(checkLength)
        if(currData.length==0)
            return false;

    return true;
}

这里的第一个参数是主数据,第二个参数是你需要检查的属性数组,第三个参数将检查最后一个元素的长度是否为0,它只检查第三个参数是否为真。

您可以像以下一样使用它:

if(!chckForKeyPresence(data, ["results", "tweets"], true)){
    // error
    return;
}