如果是其他速记代码3种情况

时间:2016-05-18 10:04:01

标签: javascript

我将如何继续缩短以下代码?

if (typeof dIndex === 'undefined') {
    dPolylines = [];
} else {
    if (typeof rIndex === 'undefined') {
        dPolylines[dIndex] = [];
    } else {
        dPolylines[dIndex][rIndex] = [];
    }
}

我觉得这8行代码最多可以很容易地转换为3行,但我对如何处理它没有正确的想法。

在我的代码中,我将需要这段代码几次。

5 个答案:

答案 0 :(得分:1)

Archer's comment已应用于您的代码:

if (typeof dIndex === 'undefined') {
    dPolylines = [];
} else if (typeof rIndex === 'undefined') {
    dPolylines[dIndex] = [];
} else {
    dPolylines[dIndex][rIndex] = [];
}

不短,但仍然可以理解(可能比原始代码更多)。

答案 1 :(得分:1)

为了缩短它而不失去任何可读性,我建议稍微修剪一下......

if (typeof dIndex === 'undefined') {
    dPolylines = [];
}
else if (typeof rIndex === 'undefined') {
    dPolylines[dIndex] = [];
} else {
    dPolylines[dIndex][rIndex] = [];
}

你可以更进一步,删除这样的大括号......

if (typeof dIndex === 'undefined') dPolylines = [];
else if (typeof rIndex === 'undefined') dPolylines[dIndex] = [];
else dPolylines[dIndex][rIndex] = [];

我个人不喜欢它,因为它比使用大括号时更容易导致错误,但每个都是他们自己的。它仍然可读,现在只有3行。

为了两全其美,你可以简单地重新格式化我提出的第一个建议,如果我看到你的任何代码,就会让我感到畏缩:p

if (typeof dIndex === 'undefined') { dPolylines = []; }
else if (typeof rIndex === 'undefined') { dPolylines[dIndex] = []; }
else { dPolylines[dIndex][rIndex] = []; }

答案 2 :(得分:0)

typeof dIndex !== 'undefined' ? dPolylines = [] : ElseCheck()


function ElseCheck(){
    typeof rIndex !== 'undefined' ? dPolylines[dIndex][rIndex] = [] : dPolylines[dIndex] = []
}

尝试三元条件

答案 3 :(得分:0)

function straightFill(obj, keys) {
   obj = obj || {};
   var cur = obj;
   var key = keys.shift();
   while (typeof key != 'undefined') {
     cur[key] = {};
     cur = cur[key];
     key = keys.shift();
   }
   console.log(JSON.stringify(obj));
   return obj;
}

var a = {};
straightFill(a, ['key1', 'key2']);              // {"key1":{"key2":{}}}
straightFill(null, [undefined, 'key2']);        // {}
straightFill(null, ['key1', undefined, 'key2']);// {"key1":{}}

为什么我使用对象代替数组? 您不应该使用带有序列号或非数字键的数组:

>> a = []
<< []
>> a['key'] = 5
<< 5
>> a
<< []
>> a.key
<< 5
>> a[2] = 4
<< 4
>> a
<< [undefined × 2, 4]
>> a.length
<< 3
>> Object.keys(a)
<< ["2", "key"]

三元解决方案:

typeof dIndex == 'undefined' ? dPolylines = [] :
    typeof rIndex == 'undefined' ? dPolylines[dIndex] = [] :
        dPolylines[dIndex][rIndex] = [];

答案 4 :(得分:0)

所以有一些解决方案可行。第一个是使用三元运算符,但它并不是那么干净:

typeof dIndex === 'undefined' ? dPolylines = [] : (typeof rIndex === 'undefined' ? dPolylines[dIndex] = [] : dPolylines[dIndex][rIndex] = []);

正如你所看到的,它太长了。考虑到Archer的回答,您将拥有以下内容:

if (typeof dIndex === 'undefined') {
    dPolylines = [];
} else if (typeof rIndex === 'undefined') {
    dPolylines[dIndex] = [];
} else {
    dPolylines[dIndex][rIndex] = [];
}

这可归结为6行,但仍然很长。但由于我将在原始代码中多次需要这段代码,因此我将其转换为函数:

dPolylines = clearDirectionsArray(dPolylines, dIndex, rIndex);

function clearDirectionsArray(array, dIndex, rIndex) {
    if (typeof dIndex === 'undefined') {
        array = [];
    } else if (typeof rIndex === 'undefined') {
        array[dIndex] = [];
    } else {
        array[dIndex][rIndex] = [];
    }

    return array;
};

这最终会在整个代码中大幅降低行数。虽然最初没有提出这个问题。