У меня есть объект, который имеет несколько членов, каждый из которых представляет собой массив. У меня есть другой объект, который включает этот объект. В конструкторе внешнего объекта я хотел бы сказать, что если пользователь передает объект, я использую его как значение для внутреннего объекта. Если они передаются в массиве, я создаю новый объект, используя переданный массив для одного из значений и генерируя другие значения по некоторым правилам для значений по умолчанию.
То есть:
class Outer {
constructor(inner) {
if (inner is an object) { // this is the statement I don't know how to write
this.inner=inner
}
else {
this.inner = {"value1":inner}
this.inner.value2=... blah blah blah
}
}
В моем первом черновике я сказал: if (typeof Internal == «object»). Это не сработало, потому что для массивов оно возвращает true. Я предполагаю, что массив — это частный случай объекта.
Поэтому я попытался сделать это по-другому и сказать внутренний экземпляр массива. Это не сработало, потому что для объектов возвращалось неопределенное значение.
Итак... есть ли способ проверить, является ли значение объектом, а не массивом?
Если это актуально, в новом Outer я хочу передать значение как литерал, т. е. я мог бы сказать new Outer([1,2,3]) или new Outer({"value1":[1,2,3] ,"значение2":[2,3,4]).
И да, я знаю, что могу решить проблему, просто всегда передавая объект, и это то, что я собираюсь делать, по крайней мере, в краткосрочной перспективе. Я думал, что New Outer был бы чище, если бы я мог сказать new Outer([1,2,3]), а не new Outer({"value1":[1,2,3]}). Но это не так уж и важно. Но мне бы хотелось знать, как это сделать, по крайней мере, для дальнейшего использования.
Вот что вам нужно сделать.
class Outer {
constructor(inner) {
if (Array.isArray(inner)) {
this.inner=inner
}
else {
this.inner = {"value1":inner}
this.inner.value2=... blah blah blah
}
}
Массивы — это особый тип объектов только в JavaScript. Итак, когда мы используем оператор typeof, он дает объект.
console.info(type of someArray);
// Will give object
Но класс Array имеет некоторые методы, такие как isArray(), которые можно использовать для определения того, является ли что-либо массивом.
Array.isArray(someArray)
Итак, эта функция возвращает логическое значение.
console.info(Array.isArray(someArray))
// Will give true
Я надеюсь, что это помогает. Приветствую 🤜🏻🤛🏻
Вы можете проверить прототип:
class Outer {
constructor(inner) {
if (Object.getPrototypeOf(inner) === Object.prototype) {
this.inner=inner
}
else {
this.inner = {"value1":inner}
}
}
}
console.info(new Outer({value1:[1,2,3]}));
console.info(new Outer([1,2,3]));
Или используйте Array.isArray()
:
class Outer {
constructor(inner) {
if (!Array.isArray(inner)) {
this.inner=inner
}
else {
this.inner = {"value1":inner}
}
}
}
console.info(new Outer({value1:[1,2,3]}));
console.info(new Outer([1,2,3]));