循环遍历项目数组的更好方法

时间:2021-01-26 13:42:21

标签: javascript arrays typescript

我有一个如下所示的模型

this.Model

Model {class: undefined items: Array(0) tag: undefined launch: undefined length: undefined name: undefined Id: "de4d704a-b754-4546-b3ab-f0c131eba84a" time: "15:36" tonnage: undefined}

模型中唯一始终具有值的对象是 Id 和时间。

我有一个 if 语句,它遍历我的每个对象以检查其是否为 null,如下所示:

    if ( this.Model.class == null && this.Model.name == null && this.Model.tag== null && this.Model.launch == null && this.Model.length == null && this.Model.tonnage == null && this.Model.items.length == 0) 
                {
                    //does something in here
                }

所以我想检查除时间和 ID 之外的所有对象是否为空,是否有比我在 if 语句中使用上述方法更好的方法?

4 个答案:

答案 0 :(得分:2)

我将创建一个函数来使用 Object.entriesArray.every 进行检查。

此解决方案的好处:

  • 可重用的实用函数。
  • 适用于任意数量的要忽略的键。
  • 如果您指定要忽略的键不是所提供对象的一部分,则函数的类型将引发错误。

Playground in TypeScript


Javascript 中的代码段。

function checkAllKeysExceptGivenKeysToBeNullable(obj, keys) {
  return Object.entries(obj).every(([
    key,
    value,
  ]) => {
    // If the key has to be ignored
    if (keys.includes(key)) {
      return true;
    }

    // Check the value to be nullable
    return value === null ||
      value === void 0 ||
      (value instanceof Array && value.length === 0);
  });
}

console.log(checkAllKeysExceptGivenKeysToBeNullable({
  class: undefined,
  items: Array(0),
  tag: undefined,
  launch: undefined,
  length: undefined,
  name: undefined,
  Id: 'de4d704a-b754-4546-b3ab-f0c131eba84a',
  time: '15:36',
  tonnage: undefined,
}, [
  'Id',
  'time',
]));

console.log(checkAllKeysExceptGivenKeysToBeNullable({
  class: undefined,
  items: Array(0),
  tag: 'nope',
  launch: undefined,
  length: undefined,
  name: undefined,
  Id: 'de4d704a-b754-4546-b3ab-f0c131eba84a',
  time: '15:36',
  tonnage: undefined,
}, [
  'Id',
  'time',
]));


function checkAllKeysExceptGivenKeysToBeNullable<T extends {
  [key in keyof T]: null | undefined | Array<unknown> | unknown;
}>(obj: T, keys: (keyof T)[]): boolean {
  return Object.entries(obj).every(([
    key,
    value,
  ]) => {
    if (keys.includes(key as keyof T)) {
      return true;
    }

    return value === null ||
           value === void 0 ||
           (value instanceof Array && value.length === 0);
  });
}

console.log(checkAllKeysExceptGivenKeysToBeNullable({
  class: undefined,
  items: Array(0),
  tag: undefined,
  launch: undefined,
  length: undefined,
  name: undefined,
  Id: 'de4d704a-b754-4546-b3ab-f0c131eba84a',
  time: '15:36',
  tonnage: undefined,
}, [
  'Id',
  'time',
]));

console.log(checkAllKeysExceptGivenKeysToBeNullable({
  class: undefined,
  items: Array(0),
  tag: 'nope',
  launch: undefined,
  length: undefined,
  name: undefined,
  Id: 'de4d704a-b754-4546-b3ab-f0c131eba84a',
  time: '15:36',
  tonnage: undefined,
}, [
  'Id',
  'time',
]));

答案 1 :(得分:1)

玩了一会之后,我想出了一个使用 Object.keys()

的解决方案
/**
 * Checks if all of the objects values are null, except for keys in param except
 * @param obj: The object to test
 * @param except (optional): keys to omit the null check on
 */
function checkIfPropertiesNull(obj: {[key: string]: unknown}, except: string[] = []): boolean {
   const keys = Object.keys(obj).filter(key => !except.includes(key));
   for(const key of keys){
       if(obj[key] !== null){
           return false;
       }
   }
   return true;
}


console.log(checkIfPropertiesNull({ id: 1, name: 'mike', city: null }, ['id', 'name'])); // true, because id and name are not checked
console.log(checkIfPropertiesNull({ id: 1, name: 'mike', city: 'Munich' }, ['id', 'name'])); // false, city isn't null

Playground

答案 2 :(得分:0)

嗯,在这种情况下你有两个选择:

  1. 将您的循环放入一个函数中以将此逻辑与您的模型分开:
function checkProperties(obj) {
    for (var key in obj) {
        if (obj[key] !== null && obj[key] != "")
            return false;
    }
    return true;
}

var obj = {
    x: null,
    y: "",
    z: 1
}

checkProperties(obj) //returns false
  1. 使用 Object.values 和 every 以数组形式检查您的属性。
let report = {
  property1: null,
  property2: null,
}

let result = !Object.values(report).every(o => o === null);

console.log(result);

答案 3 :(得分:0)

for (let prop in Modal) {
    if (Modal.prop != time && Modal.prop != id && Modal[prop] != null) {
        return false
    }
    
}
return true

如果除 ID 和时间之外的所有属性都为空,则返回 true。