javascript - 如何在 Suitelet 打印输出 (Netsuite) 中对行项目使用高阶函数而不是 FOR 循环?

标签 javascript arrays netsuite higher-order-functions suitescript

我的上级要求我使用高阶函数(.filter/.map/.reject/.reduce)打印行项目的值。我很困惑如何编写高阶函数而不是 for 循环(用于打印发票打印输出中的行值)。我只需要在数量超过 3 时打印该行。我是一名实习生,我不知道它是如何工作的,请帮忙。

链接到代码片段:https://drive.google.com/file/d/1uVQQb0dsg_bo53fT3vk9f0G8WwZomgQg/view?usp=sharing

只有当数量字段的值大于 3 时,我总是使用 if 条件来打印行。我什至知道如何 .filter 但我不知道如何调用它以及在哪里调用它。请帮忙

最佳答案

我不相信 Array.from 在服务器端代码中工作。如果确实如此,则使用它。我一直在使用的是以下功能。它们不符合指定的高阶函数,但它们使用 Netsuite 语法,并且在简化子列表处理和封装代码方面大有帮助:

//SS2.x
//I have this as a snippet that can be included in server side scripts
function iter(rec, listName, cb){
    var lim = rec.getLineCount({sublistId:listName});
    var i = 0;
    var getV = function (fld){
        return rec.getSublistValue({sublistId:listName, fieldId:fld, line:i});
    };
    for(; i< lim; i++){
        cb(i, getV);
    }
}
// to use it:
iter(ctx.newRecord, 'item', function(idx, getV){
  if(parseInt(getV('quantity')) >3){
   ...
  }
});

或者对于 SS1 脚本,我有以下内容,允许在 UserEvent 和计划脚本或 Suitelet 之间共享代码

function forRecordLines(rec, machName, op, doReverse) {
    var i, pred, incr;
    var getVal = rec ? function(fld) {
            return rec.getLineItemValue(machName, fld, i);
        } : function(fld) {
            return nlapiGetLineItemValue(machName, fld, i);
        };
    var getText = rec ? function(fld) {
            return rec.getLineItemText(machName, fld, i);
        } : function(fld) {
            return nlapiGetLineItemText(machName, fld, i);
        };
    var setVal = rec ? function(fld, val) {
            rec.setLineItemValue(machName, fld, i, val);
        } : function(fld, val) {
            nlapiSetLineItemValue(machName, fld, i, val);
        };
    var machCount = rec ? rec.getLineItemCount(machName) : nlapiGetLineItemCount(machName);

    if(!doReverse){
        i = 1;
        pred = function(){ return i<= machCount;};
        incr = function(){ i++;};
    }else{
        i = machCount;
        pred = function(){ return i>0;};
        incr = function(){ i--;};
    }

    while(pred()){
        var ret = op(i, getVal, getText, setVal);
        incr();
        if (typeof ret != 'undefined' && !ret) break;
    }

}

// User Event Script:
forRecordLines(null, 'item', function(idx, getV, getT, setV){
  if(parseInt(getV('quantity')) >3){
   ...
  } 
});

// in a Scheduled Script:
forRecordLines(nlapiLoadRecord('salesorder', id), 'item', function(idx, getV, getT, setV){
  if(parseInt(getV('quantity')) >3){
   ...
  } 
});

关于javascript - 如何在 Suitelet 打印输出 (Netsuite) 中对行项目使用高阶函数而不是 FOR 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56834876/

相关文章:

将值从一个数组复制到另一个数组

NetSuite SCA 在线编辑

javascript - 使用 jquery.get() 测试网站有哪些要求?

javascript - 使用 jQuery 将使用复选框的数据属性从 false 更改为 true

javascript - JQuery 语句仅在 success 函数内发出警报后才起作用

javascript - 在这种情况下,在 Jest 中测试 axios 函数的正确方法是什么?

c - 嵌套 for 循环改进

包含基类/派生类对象的 C++ 数组

javascript - NetSuite上的ClientScript如何知道一条记录处于哪种模式?

authentication - NetSuite SuiteTalk token 认证 : Invalid login attempt