2016-11-10 4 views
1

数値の配列が与えられている場合、javascriptの.some()メソッドを使用して最初のペアの鏡像番号を見つけて返します。javascriptの.some()関数で条件が満たされない場合の戻り値

[454,86,57,75,16,88])は[57,75]を返します。お互いに鏡像関係にない数字がない場合は、[-1、-1]を返したいと思います。私は鏡像番号があれば、その番号が返されるようになった。しかし、私はそれを[-1、-1]に戻すことはできません。どこで私は間違えましたか?

var a=0 
var b=0 
arr=[13,15,19,32,49,61,73] 

arr.some((x,i)=>{ 
    a=arr[i] 
    b=arr[i+1] 
    b= switchIt(b) 
    if(a!==b){  //what if there are no mirror image numbers found? 
     a = -1 
     b = -1 
    }else{ 
     return a==b 
    }  
}) 

function switchIt(n){ 
    n= n.toString() 
    n= n.split("") 
    var [x,y,z]=[n[0],n[1],n[2]] 
    n= [z,y,x] 
    n= n.join("") 
    n= parseInt(n) 
    return n 
} 


console.log([a,switchIt(b)]) 

答えて

1

一つの簡単なajustに反復し、あなたのコードが期待どおりに動作します:

arr.some((x,i)=>{ 
    var end = i >= (arr.length - 1); 
    a=arr[i] 
    if (!end) { 
     b=arr[i+1] 
     b = switchIt(b) 
    } 
    if(a!==b || end){ //note the OR with end variable here 
     a = -1 
     b = -1 
    }else{ 
     return a==b 
    }  
}) 

いくつかの関数が配列の終わりを見つけるときにテストが行​​われます

4

は数字の配列を考えると、私は鏡画像番号の最初のペアを見つけるとペアを返すためにはJavaScriptの.some()メソッドを使用したいです。

これは、someとは異なります。 someは真偽値を返します:sometrueを返すか、trueyの値を返しませんでした(somefalseを返します)。

あなたはあなたが望むもののためにsomeを使用できますが、何あなたが本当に欲しいのは(ES2015に追加しましたが、/完全shimmable polyfillable)findです。ここでは単純な例です:

var a = [ 
 
    {id: 1, value: "one"}, 
 
    {id: 2, value: "two"}, 
 
    {id: 3, value: "three"}, 
 
    {id: 4, value: "four"}, 
 
    {id: 5, value: "five"} 
 
]; 
 
var entry = a.find(function(e) { 
 
    return e.id === 3; 
 
}); 
 
console.log(entry);


ただ、完全を期すために、あなたsome述語がオーバー閉じ変数を使用することにより、findでtahtを行うことができます。

var a = [ 
 
    {id: 1, value: "one"}, 
 
    {id: 2, value: "two"}, 
 
    {id: 3, value: "three"}, 
 
    {id: 4, value: "four"}, 
 
    {id: 5, value: "five"} 
 
]; 
 
var entry; 
 
a.some(function(e) { 
 
    if (e.id === 3) { 
 
    entry = e; 
 
    return true; 
 
    } 
 
}); 
 
console.log(entry);

...しかし、私はそれをお勧めしません。これはまさにfindのために設計されたものです。

+0

をお勧めしたいクールああ、私は)(検索については知りませんでした。明確な説明をありがとう。 –

2

Array.someコールバック関数が任意の配列要素に対して真理値を返す場合は、trueを返します。それ以外の場合はfalseです。あなたが値を返すようにしたい場合は

、あなたの代わりにreduceを使用することができますが、それは最後

var result = arr.reduce(function(a,b,i) { 
    if (a[0]!==-1) return a; 
    if ((""+b).split("").reverse().join("") == arr[i+1]) return [b, arr[i+1]]; 
    return a; 
},[-1,-1]); 
+0

私はいつも '.split()。reverse()。join()'を使ったり、カスタムの逆関数を使うという混乱があります。私はまだどちらが良いかわからない。 – Rajesh

+0

連続したインデックスを持たないミラーは見つかりません。 –

+0

@OriDrori - 私は、与えられた例でお互いに隣り合っているので、それがポイントであると思った。 – adeneo

1

この場合はarray.someを使用することはお勧めしません。 .someの目的は、条件が満たされているかどうかを確認することです。値をフェッチする場合は、他の関数を使用する必要があります。私はarray.reduce

function getMirrorPair(arr) { 
 
    var retArr = [-1, -1] 
 
    try { 
 
    arr.reduce(function(p, c) { 
 
     if (c === getReverse(p)) { 
 
     retArr[0] = p; 
 
     retArr[1] = c; 
 
     throw new Error() 
 
     } 
 
     return c 
 
    }) 
 
    } catch (ex) {} 
 
    return retArr 
 
} 
 

 
function getReverse(num) { 
 
    var tmp = 0; 
 
    while (num > 0) { 
 
    tmp = (tmp || 0) * 10 + (num % 10); 
 
    num = parseInt(num/10); 
 
    } 
 
    return tmp 
 
} 
 
var arr = [13, 15, 23, 32, 49, 61, 73]; 
 
var arr1 = [13, 15, 19, 32, 49, 61, 73]; 
 
var r = getMirrorPair(arr); 
 
var r1 = getMirrorPair(arr1); 
 
console.log(r) 
 
console.log(r1)

+0

ありがとう!非常に役立ちます。なんらかの理由で、この割り当ては.some()メソッドの学習の一部として提示されたので、あなたの推薦は知っておくとよいでしょう。 –

関連する問題