代码之家  ›  专栏  ›  技术社区  ›  Mario

检查具有嵌套属性的对象的任何属性是否有任何值-日期失败

  •  0
  • Mario  · 技术社区  · 3 年前

    如果对象的任何属性都有值,则以下函数将返回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]
                    }
                }
            }
        }
    }
    

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

    但这个函数在日期方面失败了。例如以下对象应返回true,因为 a end 属性具有值。在这种情况下,日期

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

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

    1 回复  |  直到 3 年前
        1
  •  0
  •   CertainPerformance    3 年前

    的测试 typeof value === "object" 意味着执行递归调用的块将被输入 任何 非基元值,包括日期。考虑检查被迭代的值是否不仅是一个对象,而且是一个内部原型为 Object.prototype Array.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));