【问题标题】:Using if statement in array.forEach function statement to choose sub-object in array of objects在 array.forEach 函数语句中使用 if 语句来选择对象数组中的子对象
【发布时间】:2018-12-21 11:52:13
【问题描述】:

我无法让 if 语句在由 forEach 数组循环调用的函数内工作。

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

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 值来确定在数组arrofobj 的新变量中使用哪个ValType 元素。
- 如果没有,我想使用 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 接受代码,所以无法测试。

【问题讨论】:

  • 您遇到了什么错误?请把它们包括在问题中。如果你准确地引用了你的源代码,我猜这与你的 else 周围的大括号不匹配有关。
  • 谢谢@HarryCutts,说实话,我已经尝试了许多不同的选项,遇到了许多不同的问题,从 lint 抱怨到没有输出。

标签: javascript arrays json foreach node-red


【解决方案1】:

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 );

【讨论】:

  • 谢谢@Shilly,它有效!你给我的所有 4 分我都不知道,已经花了一天,再过一天就不会教我了。我今天学到了很多东西!
【解决方案2】:

只是为了补充 Shilly 的回答:

1) 从长远来看,如果这是您自己创建的数据,而不是来自第 3 方端点的数据,您会发现标准化对象属性键名的格式(以驼峰形式表示)会更容易跟...共事。如果它们的格式相同,它不会给您的代码带来那么多错误。

2) 您可以使用对象destructuring assignmentternary 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);

【讨论】:

  • 哇,好干净!谢谢@Andy,去实现这个!
  • 谢谢。不过,请确保您了解它的工作原理/阅读该文档。
  • 假设 val 始终为整数,另一个“升级”将使用数组而不是对象作为 valType:valType: [ "Open", "Closed" ]。如果您需要,这将使循环更容易。如果 getCat 不会被共享,您也可以使用 .map() 而不是 .forEach() 在一个语句中完成所有操作。您也可以已经添加属性 catX,其值为 null,因此对象结构保持不变。
  • 我也有同样的想法,@shilly,但最后还是决定反对它,因为订购可能是个问题。
  • 谢谢@Shilly,如果将来有什么会抓住我,你会提前考虑,会尝试其中的一些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多