【问题标题】:Javascript get short circuit variable nameJavascript获取短路变量名称
【发布时间】:2019-11-14 12:00:49
【问题描述】:

我正在像这样检查null

假设c 为空。

if (a == null || b == null || c == null || d == null) { //short cirtcuit on the first null value (c)

    let grabNullKey = a == null || b == null || c == null || d == null;

    // I want this to grab the variable that is null, instead this logs `true`

    console.log(grabNullKey)

我想将变量名 (c) 记录给用户,是否有一种简写方式来输出变量名而不是执行 4 个 if 语句?

【问题讨论】:

  • 你为什么要记录变量名?
  • @adiga yes output c 变量名,有问题更新
  • 但是,你为什么需要这个?我的意思是,可以使用 if-else 链或使用简写属性名称来做到这一点。
  • @adiga 是的,所以我知道我可以对console.log 变量名执行一大块 if-else 语句(或 switch 语句)。但是如果要检查的条件很长,它将需要很大的 if-else 块,并且由于我们已经在为 null 的变量上短路,我希望有一种快速的方法可以将变量名输出到日志。记录此信息将很有用,因此当条件中断时,调试起来会快得多。
  • const obj = { a, b, c, d }; const key = Object.keys(obj).find(k => obj[k] === null) 这样的东西应该可以工作。

标签: javascript short-circuiting


【解决方案1】:

首先是坏消息,JavaScript doesn't allow you to print a variable name as a string。好消息是有办法解决它。

为了能够打印变量名,您将需要使用一个对象而不是一系列变量。所以你需要一个像这样的对象:

const variableObject = { a: true, b: true, c: null, d: true };

要找到第一个空值并打印它,您需要遍历它们的键并找到第一个空值:

const variableObject = { a: true, b: true, c: null, d: true };
const variableNames = Object.keys(variableObject); // ['a', 'b', 'c', 'd']
const firstNullVar = variableNames.find((key) => variablesObject[key] === null); // 'c'
console.log(firstNullVar); // will print the string 'c'

如果没有一个变量是null,这将打印undefined,尽管绕过它很容易。

【讨论】:

  • 您可以使用现有变量创建对象,如下所示:const variableObject = { a, b, c, d }Shorthand property names
  • .find() 会依次通过variableObject 吗? (a -> b -> c -> d)
  • 只要键值对在对象中按该顺序排列(例如{ a: true, b: true, c: null, d: true }),它们的键就不会计算为整数,并且您使用的是 ES2015,是的。
【解决方案2】:

创建一个对象文字并将变量作为键/值对分配给对象。将对象作为参数传递给以下演示中演示的函数:

函数空值(对象)

function nulls(obj) {
  return (Object.keys(obj).filter(key => obj[key] === null)).join(', ');
}

@params 对象[对象]: 对象字面量由键(变量名,abc,...)和值(变量值,12null,...)组成

  • Object.keys(object) 返回一个键数组(变量名)
  • .filter(key => object[key] === null) 返回一个键(变量名)数组,其值 (object[key]) 为 null
  • .join(', ') 以字符串形式返回键(变量名)数组

function nulls(obj) {
  return (Object.keys(obj).filter(key => obj[key] === null)).join(', ');
}

let x = {
  a: 1,
  b: 2,
  c: null,
  d: 4,
  e: null,
  f: 6,
  g: null
};

console.log(nulls(x));

【讨论】:

    【解决方案3】:

    认为这可以做到:

    var itemsA = ['a','b','c','d'];
    var valsA = [a,b,c,d];
    var ind = valsA.indexOf(null);
    if(ind != -1){
     console.log(itemsA[ind]); 
    }
    

    你也可以通过使用带有 find 或 findIndex 的 JSON 对象来做类似的事情

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 2021-08-13
      • 1970-01-01
      • 2018-01-23
      • 2014-02-08
      相关资源
      最近更新 更多