Javascript - 在数组中插入占位符值以保持数组长度

标签 javascript arrays

我正在使用 Google Spreadsheets,我能够返回一个数组数组,其中嵌套数组是电子表格中的一行。

每一行的长度都需要完全相同,但不一定每个单元格都有一个值,因此为了弥补这些稀疏值,我使用了一个名为 empty 的占位符

例如,如果过滤器类型是 EXCLUDE 或 INCLUDE,将有四个值可用(details.fielddetails.matchTypedetails.expressionValue, details.caseSensitive);但是,如果过滤器类型是大写或小写,则只有一个值可用 (details.field)。

下面是完整的代码,它看起来比实际大得多 - 只有很多 if 语句。

有没有更好的方法来处理这些稀疏的占位符元素?我想减少代码。

Api.prototype.getAccountFilterData = function (accountsList) {
    var details, rowDefaults;
    var empty = '-';
    var results = [];

    accountsList.forEach(function (account) {
        this.wrapperGetAccountFilterData(account.id, function (filtersList) {
            filtersList.forEach(function (filter) {
                rowDefaults = [
                    account.name,
                    account.id,
                    filter.name,
                    filter.id,
                    filter.type
                ];

                if (filter.type === 'EXCLUDE' || filter.type === 'INCLUDE') {
                    details = filter.getIncludeDetails() || filter.getExcludeDetails();

                    results.push(rowDefaults.concat([
                        details.field,
                        details.matchType,
                        details.expressionValue,
                        details.caseSensitive,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty
                    ]));
                }

                if (filter.type === 'UPPERCASE' || filter.type === 'LOWERCASE') {
                    details = filter.uppercaseDetails || filter.lowercaseDetails;

                    results.push(rowDefaults.concat([
                        details.field,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty
                    ]));
                }

                if (filter.type === 'SEARCH_AND_REPLACE') {
                    details = filter.searchAndReplaceDetails;

                    results.push(rowDefaults.concat([
                        details.field,
                        empty,
                        empty,
                        details.searchString,
                        details.replaceString,
                        details.caseSensitive,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty
                    ]));

                }

                if (filter.type === 'ADVANCED') {
                    details = filter.advancedDetails;

                    results.push(rowDefaults.concat([
                        details.field,
                        empty,
                        empty,
                        empty,
                        empty,
                        empty,
                        details.fieldA,
                        details.extractA,
                        details.fieldB,
                        details.extractB,
                        details.outputToField,
                        details.outputConstructor,
                        details.fieldARequired,
                        details.fieldBRequired,
                        details.overrideOutputField,
                        details.caseSensitive
                    ]));
                }
            });
        });
    }, this);

    return results;
};

最佳答案

可以构建一个辅助函数来创建每个数组

function createRow(type, details) {
  var len = 10, empty = '-', arr = Array(len);
  // not sure if `empty` needed or not - simple loop here if so
  switch (type) {
    case 'CASES':
        arr[0] = details.field;
      break;
  }
  return arr;
}

使用

if (filter.type === 'UPPERCASE' || filter.type === 'LOWERCASE') {
    details = filter.uppercaseDetails || filter.lowercaseDetails;
    // call helper
    var row = createRow('CASES', details);
    // concat row
    results.push(rowDefaults.concat(row));
}
if(filter.ty.......

关于Javascript - 在数组中插入占位符值以保持数组长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35027188/

相关文章:

java - 将 ArrayList<String> 发送到 SP Oracle

javascript - 扩展 div 的 d3 转换

javascript - CSS div flip 仅在第一次工作

C 重新分配二维字符数组

c++ - 从索引的任一侧增加值来查找数组中的最大值

javascript - 如何按顺序和限制计算多个数组的数组元素计数之和?

javascript - 具有大数据库的 AngularJS 搜索

javascript - 我可以在非 iOS 设备上的 Cordova 应用程序中使用 Apple CloudKit JS 吗?

JavaScript 运行时错误 : Control ClientID is undefined

c++ - Arduino 打印在大量打印时失败