【问题标题】:check if any property of an object with nested properties has any value - fail for dates检查具有嵌套属性的对象的任何属性是否具有任何值 - 日期失败
【发布时间】:2023-01-07 14:10:13
【问题描述】:

如果对象的任何属性具有值,则以下函数返回 true。该对象可能有嵌套对象

function hasValue(obj) {
    for (const key in obj) {
        if (obj.hasOwnProperty(key)) {
            const value = obj[key];
            if (typeof value === "object") {
                if (hasValue(value)) {
                    return true;
                }
            } else if (value) {
                return true;
            }
        }
    }
    return false;
}

例如对于以下对象返回 true

const model = {
    criteria: '',
    category: '',
    range: {
        start: null,
        end: null
    },
    sample: '',
    another: {
        a: {
            b: {
                c: {
                    d: '',
                    e: {},
                    f: [1]
                }
            }
        }
    }
}

这是因为嵌套在 another 中的属性 f 具有具有值的数组的值

但是这个函数因日期而失败。例如。由于 aend 属性具有值,因此以下对象应返回 true。在这种情况下日期

const model = {
    criteria: "",
    category: "",
    range: {
        start: { a: [new Date()] },
        end: new Date(),
    },
};

这种行为的原因是什么?我该如何解决?也确定日期

【问题讨论】:

    标签: javascript recursion


    【解决方案1】:

    typeof value === "object"的测试意味着将进入执行递归调用的块任何非原始值,包括日期。考虑检查被迭代的值是否不仅是一个对象,而且是一个内部原型为Object.prototypeArray.prototype的对象。如果是,则递归;如果不是,则返回 true。

    function hasValue(obj) {
        for (const key in obj) {
            if (obj.hasOwnProperty(key)) {
                const value = obj[key];
                if (typeof value === "object") {
                    if ([Object.prototype, Array.prototype].includes(Object.getPrototypeOf(value))) {
                        return true;
                    } else {
                        return hasValue(value);
                    }
                } else if (value) {
                    return true;
                }
            }
        }
        return false;
    }
    const model = {
        criteria: "",
        category: "",
        range: {
            start: { a: [new Date()] },
            end: new Date(),
        },
    };
    console.log(hasValue(model));

    除非你确实需要自己的财产检查,在大多数情况下,您可以使用Object.values简化一点。 (因为你不关心键,除非你可以得到值,所以更容易直接迭代值。)

    function hasValue(obj) {
      for (const value of Object.values(obj)) {
            if (typeof value === "object") {
                if ([Object.prototype, Array.prototype].includes(Object.getPrototypeOf(value))) {
                    return true;
                } else {
                    return hasValue(value);
                }
            } else if (value) {
                return true;
            }
        }
        return false;
    }
    const model = {
        criteria: "",
        category: "",
        range: {
            start: { a: [new Date()] },
            end: new Date(),
        },
    };
    console.log(hasValue(model));

    【讨论】:

      猜你喜欢
      • 2022-06-30
      • 2018-02-09
      • 2020-06-08
      • 1970-01-01
      • 2022-08-04
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多