代码之家  ›  专栏  ›  技术社区  ›  Jéan

使用array.forEach函数语句中的if语句选择对象数组中的子对象

  •  -1
  • Jéan  · 技术社区  · 6 年前

    我无法在forEach数组循环调用的函数中使用if语句。

    我有一个包含对象的数组,(包含一个对象)

    arrofobj = [   
    {"thing_id":"1a", "val": 1, "Type": "Switch","ValType":{"0":"Open","1":"Closed"}},  
    {"thing_id":"1b", "val": 72, "Type": "Sensor","ValType":{"0":"%"}}]
    

    我想测试一下 Type CatX :
    -如果是,我想使用 val 值来确定 ValType 要在数组的新变量中使用的元素 arrofobj
    -如果不是,我想使用arrofobj.ValType.0值

    const getCat = function(){
        if(arrofobj.Type !== 'Switch') 
            arrofobj.ValType'.0' 
        } else {
            arrofobj.ValType.(arrofobj.val)
    };
    
    arrofobj.forEach(p => p.CatX = getCat() ); 
    

    我没有让lint接受代码,因此无法测试。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Shilly    6 年前

    1) 必须使用括号表示法以字符串形式访问属性。

    2) 您必须正确关闭if/else上的括号。

    3) 您必须从getCat内部返回一些内容,才能将一些内容分配给p.CatX

    4) 实际上,您必须在循环内将对象发送给getCat。

    const arrofobj = [   
      {"thing_id":"1a", "val": 1, "Type": "Switch","ValType":{"0":"Open","1":"Closed"}},  
      {"thing_id":"1b", "val": 72, "Type": "Sensor","ValType":{"0":"%"}}
    ];
    const getCat = function( obj ){
        if(obj.Type !== 'Switch') {
            return obj.ValType[ '0' ]
        } else {
            return obj.ValType[ obj.val ];
        }
    };
    
    arrofobj.forEach(p => {
      p.CatX = getCat(p);
    }); 
    
    console.log( arrofobj );
        2
  •  2
  •   Andy    6 年前

    再补充一下Shilly的回答:

    1) 从长远来看,如果这是您自己创建的数据,而不是来自第三方端点的数据,您会发现标准化对象属性键名称的格式(在camelCase中)更容易使用。如果代码的格式相同,它就不会给代码带来那么多的bug。

    2) 您可以使用对象 destructuring assignment ternary operator 以稍微缩短代码占用空间。

    const arrofobj = [
      { id: '1a', val: 1, type: 'Switch', valType: { '0': 'Open', '1': 'Closed' } },
      { id: '1b', val: 72, type: 'Sensor', valType: { '0': '%' } }
    ];
    
    function getCat(obj) {
    
      // Deconstruct the properties from obj
      const { type, valType, val } = obj;
    
      // Use a ternary operator to decide what to return
      return type === 'Switch' ? valType[val] : valType['0'];
    }
    
    arrofobj.forEach(obj => {
       obj.catX = getCat(obj);
    });
    
    console.log(arrofobj);