2016-10-26 8 views
3

私は、2つの異なる配列の文字列の間で最大の長さの差を見つけようとしています。私はループ内にループを入れて繰り返し、すべての文字列の長さの差を見つけます。配列内の文字列の長さの差

function mxdiflg(a1, a2) { 
    if (a1 === [] || a2 === []) 
    return -1; 
    var result = 0; 
    for (var i in a1) { 
    for (var j in a2) { 
     var diff = Math.abs(i.length - j.length); 
     if (diff > result) 
     result = diff; 
    } 
    } 
    return result; 
} 

ただし、このコードでは空の配列をチェックする最初のif文は無視されています。また、ループが機能していないことを示す0を返します。

+0

したがって、配列から最長および最短の文字列を取得したいですか? – Weedoze

+7

配列を空の配列と比較しないでください。 Array型は参照型なので、これはうまくいきません。代わりに各配列の長さがゼロでないことを確認してください。 – Renan

+0

ありがとう私は最初のif文を 'a1.length === 0 ||代わりにa2.length === 0'を使用します。この状況でlengthプロパティを使用する以外に、空の配列を調べる別の方法はありますか? – James

答えて

1

まず、配列をそのように比較することはできません。 Renanと同様に、配列は参照型です。配列内に何かがあるかどうかをチェックしてください。

if (!a1.length || !a2.length) 
    return -1; 

今他の問題があります。 forループ内の配列をループすると、あなたのvarが現在のインデックスに設定されます。

どちらかforEachを使用します。

function mxdiflg(a1, a2) { 
    ... 
    var result = 0; 
    a1.forEach(function(i){ 
     a2.forEach(function(j){ 
      var diff = Math.abs(i.length - j.length); 
      if (diff > result) 
       result = diff; 
     }); 
    }); 
    return result; 
} 

// mxdiflg(['1','1'], ['111','1']) 

または、配列から項目を得るためにあなたの機能を変更、インデックスに基づいて:余談として

function mxdiflg(a1, a2) { 
    ... 
    var result = 0; 
    for (var idx in a1) { 
     for (var jdx in a2) { 
      var diff = Math.abs(a1[idx].length - a2[jdx].length); 
      if (diff > result) 
       result = diff; 
     } 
    } 
    return result; 
} 

// mxdiflg(['1','1'], ['11','1']) 

を、あなたはES6を使用している場合、あなたはこれを行うことができます。私はそれをはるかに読みやすくします。その後、

function mxdiflg(a1, a2) { 
    if (!a1.length || !a2.length){ 
    return -1; 
    } 

    var a1Lengths = a1.map((str) => str.length); 
    var a2Lengths = a2.map((str) => str.length); 

    var a1MaxLength = Math.max(...a1Lengths); 
    var a2MaxLength = Math.max(...a2Lengths); 

    return a2MaxLength - a1MaxLength; 
} 

// mxdiflg(['1','1'], ['111','1']) = 2 
+0

申し訳ありませんが十分に明確でない場合。私は2つの配列の文字列の長さの最大の違いが欲しかった。 2つの配列の最大長文字列の違いではありません。 – James

+0

私は実際に同じ文字列内にあるかどうかにかかわらず、長さの最大の違いを見つける別のバージョンを書いていました。 'function mxdiflg(a1、a2){ if(!a1.length ||!a2.length) は-1を返します。 var newArr = [];newArr = newArr.concat(a1、a2).map((s)=> s.length); return Math.abs(Math.max(... newArr) - Math.min(... newArr)); }「私はこれを少なくとも動作させました。 – James

+0

ああ、OK。ええ、「Math.max」の1つをES6の「Math.min」に切り替えるだけです。私は必要に応じて、それに応じてES5を調整することができます。あなたが正しい道にいるように思える。 –

0

(そうしないと、常にfalseになります新しい、空の配列にヨールの配列を比較しているため) と

for (var i in a1) { 
    for (var j in a2) { 
    ... 
    } 
} 

if (!a1.length || !a2.length) 

if (a1 === [] || a2 === []) 

を交換してください

for (var i of a1) { 
    for (var j of a2) { 
    ... 
    } 
} 

for ... inはキー/インデックスで、[0,1,2,3、...]などの値ではないため)。

0

配列a1は決して[]と等しくないので、参照が比較されているため、[] == []でも偽になります。数字や文字列の値ではないからです。 Operatorsをチェックしてください。アレイの長さが空かどうかを調べます。

0
var a1 = ['aaa','aa','a'], 
    a2 = ['b','bbbbbbbb','b']; 


function mxdiflg(a1, a2) { 
    if (!a1.length || !a2.length) 
    return -1; 
    var result = 0; 
    for (var i=0; i<a1.length;i+=1) { 
    for (var j=0;j<a2.length;j+=1) { 
     var diff = Math.abs(a1[i].length - a2[j].length); 
     if (diff > result) 
     result = diff; 
    } 
    } 
    return result; 
} 

mxdiflg(a1,a2); 

ない史上最高のJSができますが、文字列の長さによって

0

ソート配列を書いたものの作業コピーとは、お互いに対して(開始と終了)両極端をテストします。

//Initial data 
 
var arr1 = ["Hello", "lol", "Testing"]; 
 
var arr2 = ["Houston", "Texas", "Bi-Polar Bear"]; 
 
//"Bi-Polar Bear" is longest and "lol" is shortest. 
 

 
function findLongestStringDiff(arr1, arr2) { 
 
    function findLongest(a, b) { 
 
    return b.length - a.length; 
 
    } 
 
    arr1 = arr1.sort(findLongest); 
 
    arr2 = arr2.sort(findLongest); 
 
    return Math.max(
 
    arr1[0].length - arr2[arr2.length - 1].length, 
 
    arr2[0].length - arr1[arr1.length - 1].length 
 
); 
 
} 
 
var diff = findLongestStringDiff(arr1, arr2); 
 
console.log(diff);

0

あなたがそのような配列を比較することはできませんあなたのコードと間違って多くのこと、

1)がありますが、配列のインデックスが存在しないか、いないかどうかをチェックれる代わりに「typeof演算」を使用します。

2)のために、ループあなたがお互いを相殺し、あなたが値として0を取得します配列インデックスの長さを比較している使用している、あなたはこの例

を助けるかもしれないこのプロセス のためのループのために通常使用する必要があります
function mxdiflg(){ 

    var a1 =['asd','asdasd','asddfgsd']; 
    var a2 = ['werw','werrewerewr','werwreewrererwer']; 


if ((typeof a1[0] !== 'undefined')&& (typeof a2[0] !== 'undefined')){ 

    var result = 0; 
    for (var i=0;i<a1.length;i++) { 
     for (var j=0;j<a2.length;j++) { 
      var diff = Math.abs(a1[i].length - a2[j].length); 

      if (diff > result) 
       result = diff; 
      } 
      } 
     } 
     return result; 

    }