Проверьте, все ли элементы массива имеют одинаковый конструктор [lodash] - PullRequest
0 голосов
/ 23 января 2019

Допустим, у нас есть класс:

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

и две коллекции:

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

Вопрос:
Есть ли у lodash методы для определения, все ли элементы в коллекцииодного и того же конструктора?


Ожидаемый результат:

_.isArrayOf(arr1, MyClass) // => true
_.isArrayOf(arr2, MyClass) // => false

EDIT

Расширение вопроса (вариант 2):
Допустим, мыиметь наследуемый класс:

class MyChildClass extends MyClass {
    constructor() {
        this.childProp1 = 4
    }
}

и коллекции:

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

ожидаемые результаты:

_.isArrayOf(arr1, MyClass) // => true
_.isArrayOf(arr2, MyClass) // => false

Ответы [ 2 ]

0 голосов
/ 23 января 2019

У Lodash нет такого метода, но вы всегда можете использовать every так:

_.every([new MyClass(), new MyClass(), new MyClass()], i => i.constructor === MyClass);
0 голосов
/ 23 января 2019

Это тривиально с ванильным 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));

Не стесняйтесь использовать для этого 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));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.core.min.js"></script>

Проверка .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));
...