【问题标题】:How to check if a value in object is a primitive?如何检查对象中的值是否是原始值?
【发布时间】:2020-02-20 13:59:23
【问题描述】:

所以基本上我想检查我的数据(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()。如果它是原始的,则抛出错误,如果它是一个对象 -> 从它获取值,如果它是一个数组 -> 从那里获取值。我知道这很多,但从所有令人困惑的东西中我似乎无法想清楚,所以我很感激我能得到的每一个帮助。

【问题讨论】:

  • 我不确定问题是什么。但是 Object 接受一个参数并返回一个 Object 所以如果 Object(test) !==test 那么 test 是原始的
  • 所以我得到了一个对象,其中包含一个键和一个值(例如:'ArtNr': 1423)。我想根据我的 isPrimitive 函数检查值
  • typeof i === null || typeof i === undefined 不会发生(typeof 运算符 always 返回一个字符串)。我想你想要typeof i === 'undefined' || i === null
  • 您的函数名为 isPrimitive,但它接受 object 参数 - 您应该将函数重命名为 isObjectContainingOnlyPrimitiveValues 或更具体的名称,因为 object 值(除了 null)不是原始值。
  • 谢谢,我会试试的。 (我也更新了我的问题,希望现在更清楚)

标签: javascript typescript types primitive


【解决方案1】:

您将在第一次迭代时从您的函数返回。如果你发现了一个非原始的,你应该只返回 false,如果你能够遍历所有的值,你可以返回 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'
}

【讨论】:

  • 好的,我会试试你的解决方案,但我还需要区分我的 Data 对象是否是一个包含原语的数组,我该怎么做?
  • 所以如果某些值是只有基元的数组,您是否希望 isObjectContainingPrimitiveValues 也返回 true?
  • 是的,但我不知道
  • 非常感谢您,如果您有时间,我还有最后一个问题(抱歉总是更新我的问题)
  • 对不起,我不明白。因此,您使用 isObjectContainingPrimitiveValues 检查了 contextEntry,现在您想对 namesSplit 中的每个元素执行相同的过程?
【解决方案2】:

数组和对象类型都返回一个'typeof''object'。因此您可以检查一个对象,而不是检查多个条件。 所以返回语句将是: return (typeof i === 'object')。 在上面的语句中,数字、字符串、未定义、null 都将返回 false。

【讨论】:

  • 为什么?我不是 100% 明白,你介意解释得更详细一点吗?为什么 Number、String 等会返回 false?
  • 返回的值也可能有如下结果:{ name: "Artikel", value: {[Artnr: 1234]}}
  • 我否决了这个答案,因为它不正确。在控制台中运行:var x = null; console.log( typeof x ); 将输出 'object'。见这里:2ality.com/2013/10/typeof-null.html
猜你喜欢
  • 2021-11-06
  • 1970-01-01
  • 2016-09-27
  • 2011-05-16
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 2020-07-09
相关资源
最近更新 更多