我一直想变得更加面向对象。我在 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/