这段代码可以缩短并更容易实现吗?

时间:2018-02-05 01:10:24

标签: javascript arrays node-red

我为节点红色制作一个脚本,我希望简化实现。我怎么能更压缩这个代码呢?

var notDetected = "NOT DETECTED";
var models = [
    context.get('model1')||notDetected,
    context.get('model2')||notDetected,
    context.get('model3')||notDetected,
    context.get('model4')||notDetected
];
switch(msg.topic)
{
    case "core_1":
        models[0] = msg.model + "";
        context.set('model1', models[0]);
        break;
    case "core_2":
        models[1] = msg.model + "";
        context.set('model2', models[1]);
        break;
    case "core_3":
        models[2] = msg.model + "";
        context.set('model3', models[2]);
        break;
    case "core_4":
        models[3] = msg.model + "";
        context.set('model4', models[3]);
        break;
}
var msgs = [
    {payload: models[0]},
    {payload: models[1]},
    {payload: models[2]},
    {payload: models[3]}
];
return msgs;

模型可以压缩得更多吗?消息怎么样?我可以删除模型中的id以匹配msgs id,例如

msg[x] = {payload: models[x]};

有可能吗?

3 个答案:

答案 0 :(得分:1)

在可读性/可扩展性(不一定是空格)方面压缩代码:

  • 您可以使用循环来填充modelsmsgs数组,
  • 您可以在第一个“_”处拆分core_X字符串以获取索引,但如果您不验证输入,这可能会导致安全问题;或者您可以使用四个字符串core_1中的地图到实际数字。

在这里查看for循环:https://www.w3schools.com/js/js_loop_for.asp

看起来像这样:

var msgs = [];
for (x = 0; x < 4; x++) { 
    msgs[x] = {payload: models[x]};
}

答案 1 :(得分:1)

您可以将context.get()包装在单个函数中,并在 models 数组中重复使用它,这样您就不必更改数组中的每个索引改变了。

示例:

var notDetected = "NOT DETECTED";

var getContext = function(str) {
  return context.get(str) || "NOT DETECTED";
}

var models = [
    getContext('model1'),
    getContext('model2'),
    getContext('model3'),
    getContext('model4'),
];

如果您需要对context.get()进行更改,您可以在函数中更改一次,如下所示:differentContext.get(str) || "NOT DETECTED"

如果没有它,你必须改变每个索引:

var models = [
    differentContext.get('model1')||notDetected,
    differentContext.get('model2')||notDetected,
    differentContext.get('model3')||notDetected,
    differentContext.get('model4')||notDetected
];

答案 2 :(得分:0)

因此,在思考了一点之后我制作了一个脚本,它只是将4条消息重定向到他们需要去的地方,然后在另一个脚本中使用所需的参数,或者从整个msg中获取msg.model。这是拆分代码:

var notDetected = {};
var msgs = [
    context.get('msg1')||notDetected,
    context.get('msg2')||notDetected,
    context.get('msg3')||notDetected,
    context.get('msg4')||notDetected
];
switch(msg.topic)
{
    case "core_1":
        context.set('msg1', msg);
        break;
    case "core_2":
        context.set('msg2', msg);
        break;
    case "core_3":
        context.set('msg3', msg);
        break;
    case "core_4":
        context.set('msg4', msg);
        break;
}
return msgs;

在文本节点中我只是设置使用msg.model值。现在我得到了更有用的分离器。