Как проверить, является ли значение в объекте примитивом? - PullRequest
2 голосов
/ 20 февраля 2020

Итак, в основном я хочу проверить, имеет ли мои данные (в формате JSON) значение, которое является примитивным. Итак, давайте рассмотрим пример: я получаю данные, которые выглядят так: {name: Artikel, value: {"ArtNr": 1234}}, и я хочу проверить, является ли 1234 примитивным или нет. Я также хочу различать, если в результате получается массив с примитивами или объект. Возможно ли это?

function isObjectContainingPrimitiveValues(test) {
        let values = Object.values(test);
        for (let i of values) {
            console.log(i);
            return (typeof i === 'string' || typeof i === 'number' || typeof i === 'boolean' || typeof i === null || typeof i === undefined);
        }
    }

ОБНОВЛЕНИЕ

Итак, с помощью MaxK я создал функцию isResultContainingPrimitiveValues(), которая проверяет мои данные для примитивных / примитивных массивов и или объекты. Следующая часть самая хитрая, по крайней мере, с моим пониманием. Следующий пример, надеюсь, поможет вам лучше понять мои проблемы.

Таким образом, моя переменная let namesSplit = treeNode.name.split('.'); разделяет данные, которые она получает и имеет в результате nameSplit : Artikel,Artnr. Затем я определил ключевую переменную let key = namesSplit[0];, в результате которой key : Artikel. Затем я определяю переменную contextEntry let contextEntry = exprData.contextEntry.find(_x => _x.name === key); и в результате contextEntry : {"name":"Artikel","value":{"ArtNr":123}}. Теперь я хочу проверить: есть ли еще один сплит namesSplit.length > 1, проверьте isResultContainingPrimitiveValues(). Если это примитивно, выведите ошибку, если это объект -> получить значения из него и если это массив -> получить значения там. Я знаю, что это много, но из всех запутанных вещей я, кажется, не могу думать ясно, поэтому я ценю каждую помощь, которую я могу получить.

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Вы возвращаетесь из своей функции на первой итерации. Вы должны возвращать false, только если вы нашли не примитив и если вы смогли l oop по всем значениям, вы можете вернуть true, потому что все значения являются примитивами:

function isObjectContainingPrimitiveValues(testObj) {
  let values = Object.values(testObj);
  for(let i of values){
     if (typeof i === 'object') {
       return false;
     }
  }
  return true;
};

Обновление:

После прочтения вашего комментария я изменил код, чтобы также проверять массивы с примитивами. Идея состоит в том, чтобы создать новую функцию, которая только проверяет, является ли единственное значение примитивом. Теперь, если мы найдем массив, мы можем просто проверить - с помощью массивов некоторую функцию - если некоторый элемент внутри массива не примитивный. Если это так, верните false, в противном случае мы делаем те же проверки, что и раньше:

function isObjectContainingPrimitiveValues(testObj) {
  let values = Object.values(testObj);
  for (let i of values) {
    if (Array.isArray(i)) {
      if (i.some(val => !isPrimitive(val)))
        return false;
    } else {
      if (!isPrimitive(i))
        return false;
    }
  }
  return true;
};

function isPrimitive(test) {
  return typeof test !== 'object'
}
0 голосов
/ 20 февраля 2020

Все типы массивов и объектов возвращают тип объекта. так что вы можете проверить объект, а не несколько условий. Таким образом, оператор возврата будет: return (typeof i === 'object'). Number, string, undefined, null все вернут false в приведенном выше утверждении.

...