检查所有数组项是否都是相同的构造函数[lodash]

dor*_*far 2 javascript lodash

假设我们有一个班级:

class MyClass {
    constructor() {
        this.prop1 = 1;
        this.prop2 = 2;
        this.whatever = 3;
    }
}
Run Code Online (Sandbox Code Playgroud)

和两个集合:

arr1 = [new MyClass(), new MyClass(), new MyClass()];
arr2 = [new MyClass(), new MyClass(), "notMyClassObject"];
Run Code Online (Sandbox Code Playgroud)

问题是:
lodash是否有方法来检测集合中的所有项是否都是相同的构造函数?


预期结果:

_.isArrayOf(arr1, MyClass) // => true
_.isArrayOf(arr2, MyClass) // => false
Run Code Online (Sandbox Code Playgroud)

编辑

问题扩展(案例2):
假设我们有一个继承的类:

class MyChildClass extends MyClass {
    constructor() {
        this.childProp1 = 4
    }
}
Run Code Online (Sandbox Code Playgroud)

和收藏品:

arr1 = [new MyClass(), new MyChildClass(), new MyClass()];
arr2 = [new MyClass(), new MyChildClass(), "notMyClassObject"]
Run Code Online (Sandbox Code Playgroud)

预期成绩:

_.isArrayOf(arr1, MyClass) // => true
_.isArrayOf(arr2, MyClass) // => false
Run Code Online (Sandbox Code Playgroud)

Cer*_*nce 5

这对于vanilla JS来说是微不足道的Array.prototype.every,不需要库:

class MyClass {
    constructor() {
        this.prop1 = 1;
        this.prop2 = 2;
        this.whatever = 3;
    }
}

const arr1 = [new MyClass(), new MyClass(), new MyClass()];
const arr2 = [new MyClass(), new MyClass(), "notMyClassObject"];

console.log(arr1.every(i => i.constructor === MyClass));
console.log(arr2.every(i => i.constructor === MyClass));
Run Code Online (Sandbox Code Playgroud)

如果你愿意,可以随意使用lodash:

class MyClass {
    constructor() {
        this.prop1 = 1;
        this.prop2 = 2;
        this.whatever = 3;
    }
}

const arr1 = [new MyClass(), new MyClass(), new MyClass()];
const arr2 = [new MyClass(), new MyClass(), "notMyClassObject"];

console.log(_.every(arr1, i => i.constructor === MyClass));
console.log(_.every(arr2, i => i.constructor === MyClass));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.core.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

.constructor检查将检查项目上迭代与创造new MyClass()-包括亚类,使用instanceof:

class MyClass {
    constructor() {
        this.prop1 = 1;
        this.prop2 = 2;
        this.whatever = 3;
    }
}
class Child extends MyClass {
}

const arr1 = [new MyClass(), new Child(), new MyClass()];
const arr2 = [new MyClass(), new MyClass(), "notMyClassObject"];

console.log(arr1.every(i => i instanceof MyClass));
console.log(arr2.every(i => i instanceof MyClass));
Run Code Online (Sandbox Code Playgroud)

  • `.constructor`是故意非常具体的,为了允许子类,使用`instanceof` (2认同)