javascript - 变得更加 OO 多个 For 循环 JS

标签 javascript netsuite

我一直想变得更加面向对象。我在 NetSuite 中进行了一些开发,他们的 API 是用 JS 编写的。我有下面的代码。这是它的作用。

1) 搜索 API 会搜索所有水上交易。

2) 循环遍历所有交易,然后搜索所有交易,并对它们进行另一次搜索。原因是 NetSuite 的 API 管理仅允许 1000 行搜索 API(这也可以通过其他方式解决)。也想这样做,因为将在其他逻辑中工作,这将使这种方式成为必要。

3) 然后将从记录创建的这些值(项目、数量)推送到三个数组中。 4) 最后一个循环循环遍历三个数组,然后打印出项目和从交易中创建的数量值的次数。这是因为我们要将它们打印为每个项目的标签。

现在一直想变得更加OO。我做了另一件事类似的事情,我用键和值循环对象。认为这很整洁。我的问题是如何让这个更加面向对象。我对自己要做什么有一些想法,但想听听一些想法。

1) 创建一些将调用步骤 3 和步骤 4 的函数。因此每次循环时都会调用函数
2)我想用回调或 promise 做一些事情。在这种情况下可能没有用处,但是 3) 将项目推送到对象中,然后在这些对象上运行 forEach 方法。

所以问题是如何用 JavaScript 使这种更具 OO 风格。

// search APIs
filters = [];
filters[0] = new nlobjSearchFilter('location', null, 'anyof', ['23','25','20','24']);
filters[1] = new nlobjSearchFilter('mainline', null, 'is', 'true');

var columns = [];
columns[0] = new nlobjSearchColumn('tranid');
columns[1] = new nlobjSearchColumn('createdfrom');

var searchResults =[];
var searchResults = nlapiSearchRecord('itemreceipt', null, filters, columns);

tranId = [];
createdFrom = [];
quantity = [];
item = [];
data = '';

if(searchResults){
      for (var i = 0; i < 5; i++){
            // gets all internal IDs  
            var tranId = searchResults[i].getValue(columns[0]);

            filtersLine = [];
            filtersLine[0] = new nlobjSearchFilter('tranid', null, 'is', tranId);
            filtersLine[1] = new nlobjSearchFilter('mainline', null, 'is', 'false');

            var columnsLine = [];
            columnsLine[0] = new nlobjSearchColumn('item');
            columnsLine[1] = new nlobjSearchColumn('createdfrom');
            columnsLine[2] = new nlobjSearchColumn('quantity');

            var searchResultsLine =[];
            var searchResultsLine = nlapiSearchRecord('itemreceipt', null, filtersLine, columnsLine);


            for (var j = 0; j < searchResultsLine.length; j++){
                  item.push(searchResultsLine[j].getText(columnsLine[0]));
                  createdFrom.push(searchResultsLine[j].getText(columnsLine[1]));
                  quantity.push(searchResultsLine[j].getValue(columnsLine[2])); 

                  for (var x = 0; x < quantity[j]; x++){
                        if(createdFrom[j] != 'undefined'){
                              data += item[j] + createdFrom[j] + '\n'; 
                              console.log(item[j] + ' ' + createdFrom[j].substring(16) + '\n');
                        }
                  }
         
            }
      }
}

最佳答案

您正在对每个搜索结果进行搜索,这会影响您的治理点。我检查了代码,发现没有必要使用那么多搜索。我重构了代码以使用更多函数,还嵌套了函数,这应该使其更具可读性和可扩展性。我还添加了几个过滤器,以避免获取超出您需要的数据。无论如何,代码就是这样,欢迎您进一步优化。

var itemsToProcess = getItemsToProcess();
var data = getDataString(itemsToProcess);

//**** HELPER FUNCTIONS ****//
function getItemsToProcess(){
    // search APIs
    var filters = [];
    filters.push(new nlobjSearchFilter('location', null, 'anyof', ['23','25','20','24']));
    filters.push(new nlobjSearchFilter('createdfrom', null, 'isnotempty'));
    filters.push(new nlobjSearchFilter('quantity', null, 'greaterthan', 0)); //Filtering out items with no quantity
    filters.push(new nlobjSearchFilter('mainline', null, 'is', 'F')); //Dont want to get any extra info
    filters.push(new nlobjSearchFilter('shipping', null, 'is', 'F')); //Dont want to get any extra info
    filters.push(new nlobjSearchFilter('cogs', null, 'is', 'F')); //Dont want to get any extra info
    filters.push(new nlobjSearchFilter('taxline', null, 'is', 'F')); //Dont want to get any extra info

    var columns = [];
    columns.push(new nlobjSearchColumn('item'));
    columns.push(new nlobjSearchColumn('createdfrom'));
    columns.push(new nlobjSearchColumn('quantity'));

    var searchResults = fullSearch('itemreceipt', filters, columns);

    var rows = [];
    for(var i in searchResults){
        var result = {};
        result.item = searchResults[i].getText(columnsLine[0]);
        result.createdFrom = searchResults[i].getText(columnsLine[1]);
        result.quantity = searchResults[i].getValue(columnsLine[2]);
        rows.push(result);
    }
    return rows;

    //**** HELPER FUNCTIONS ****//
    function fullSearch(type, filters, columns){
        var search = nlapiCreateSearch(type, filters, columns);
        var resultset = search.runSearch();
        var resultsets = [];
        var returnSearchResults = [];
        var searchid = 0;
        var startdate, enddate, resultslice;
        /* Grabs results first */
        do {
            resultslice = getResultSlice(resultset, searchid);
            for (var rs in resultslice) {
                returnSearchResults.push(resultslice[rs]);
                searchid++;
            }
        } while (resultslice.length == 1000);

        return returnSearchResults;

        //*********** HELPER FUNCTION ***********/
        function getResultSlice(resultset, searchid){
            var resultslice = resultset.getResults(searchid, searchid + 1000);
            return resultslice || [];
        }
    }

}

function getDataString(itemsToProcess){
    var data = '';
    for(var i in itemsToProcess){
        data += printItem(itemsToProcess[i].item, itemsToProcess[i].createdFrom, itemsToProcess[i].quantity);
    }
    return data;

    //**** HELPER FUNCTIONS ****//
    function printItem(item, createdFrom, quantity){
        var tempString = '';
        for (var x = 0; x < quantity; x++){
            console.log(item + ' ' + createdFrom.substring(16));
            tempString += item + createdFrom + '\n'; 
        }
        return tempString;
    }
}

关于javascript - 变得更加 OO 多个 For 循环 JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40433083/

相关文章:

javascript - 如何使用 Mapbox GL JS 和对象制作等值线图?

c# - 尝试使用 C# 程序从 NetSuite 中的 FileCabinet 下载文件

netsuite - 在 Netsuite 中通过 PHP 创建采购订单时更改商品价格

php - 如何在 netsuite php 工具包 2012.2 中获取自定义项目字段?

netsuite - 从 NetSuite 获取所有记录类型

javascript - 递归中的变量.replace with regexp

javascript - Flask-SocketIO 没有收到消息

api - 如何在 netsuite 1.0 搜索过滤器上使用子列表项?我尝试执行 item.fieldname 但它导致错误

javascript - ReactJS - 如何为 SEO 渲染 iframe 内部内容服务器端?

php - 如何阻止事件处理程序的执行?