1

とにかくこのループをもっと短く書くことができるかどうか疑問に思っています。

var m, d, y

// date.length === format.length
for (var i = 0, len = format.length; i < len; i++) {
  if (/m/.test(format[i])) m = date[i]
  if (/d/.test(format[i])) d = date[i]
  if (/y/.test(format[i])) y = date[i]
}
4

3 に答える 3

1

あなたの例は十分に短いので変更しませんが、例のために、次のようにコードをより動的にすることができます。

var obj = {};
var mdy = ['m', 'd', 'y']
var curLetter;
for (var i = 0, len = format.length; i < len; i++) {
    curLetter = mdy[i];
    if ((new Regexp(curLetter)).test(format[i])) obj[curLetter] = date[i];
}
var m = obj.m;
var d = obj.d;
var y = obj.y;

obj のプロパティだけが必要な場合は、最後の 3 行は必要ありません。

于 2012-06-21T09:59:11.060 に答える
1

eval()より一般的なループを記述するために使用できます。

var parts = ['d', 'm', 'y'],
    part,
    indexOfPart,
    d, m, y;

// Iterate over the variable you want to assign
for (int i = 0; i < parts.length; i++) {
    part = parts[i];

    // Find out where in the format is the current part of the date
    indexOfPart = format.indexOf(part);

    // If it is present, use eval to assign your variable
    if (indexOfPart !== -1) {
        eval(part + " = date[" + indexOfPart + "];");
    }
}
于 2012-07-01T12:46:32.337 に答える
1

構文の節約?変数を保存します。forヘッダーに入れます

// date.length === format.length
for (var m, d, y, i = 0, len = format.length; i < len; i++) {
  if (/m/.test(format[i])) m = date[i]
  if (/d/.test(format[i])) d = date[i]
  if (/y/.test(format[i])) y = date[i]
}

または多分条件:

for (var m, d, y, i = 0, len = format.length; i < len; i++) {
  (/m/.test(format[i])) ? m = date[i] 
  :(/d/.test(format[i])) ? d = date[i] 
  :(/y/.test(format[i])) y = date[i] 
  : continue;
}

しかし、これはロジックを変更し、これが必要かどうかわかりません

おそらく、実行を高速化するために continue を追加できますが、ロジックについてはわかりません

for (var m, d, y, i = 0, len = format.length; i < len; i++) {
  if (/m/.test(format[i])){
    m = date[i]
    //jump to next since this has been found
    continue;
  }
  if (/d/.test(format[i])){
    d = date[i]
    continue;
  }
  if (/y/.test(format[i])){
    y = date[i]
    continue;
  }
}
于 2012-06-21T12:01:45.810 に答える