2016-08-01 7 views
-1

インデックスから特定の要素を配列から削除するデモを作成しました。splice()を使用する前後の結果配列の取得

var splice_a = function (array, index) { 
 
    array.splice(index, 1); 
 
    return array 
 
}; 
 

 
var splice_b = function (array, index) { 
 
    return array.splice(index, 1) 
 
}; 
 

 
var test = function() { 
 
    var array = [1, 2, 3]; 
 
    
 
    alert(splice_a(array, 1)); 
 
    alert(splice_b(array, 1)); 
 
};
<button onclick="test()">Click me</button>

Array.prototype.splice()return valueについてこう述べています。

削除された要素を含む配列。 1つの要素が の場合、1つの要素の配列が返されます。 の要素が削除されていない場合は、空の配列が返されます。

結果の配列を取得したい場合は、キーワードreturnと組み合わせる必要がありますか?私は2差の結果を取得していますので、

それはケースのようになります。

1,3

私の質問:のは、このケースでreturn array.splice(index, 1)で起こる何?

+0

はい、あなたは関数がその値を返すようにしたい場合は、値を 'return'キーワードを使用する必要があります。 – Malk

+0

私はあなたがここで誤解しているものは見ません。投稿したコードスニペットは、MDNで説明したのと同じ動作を示します。 'Array.prototype.splice'の結果を返すと、元の配列ではなく、削除された要素の配列を取得します。 – Damon

+0

@Damonあなたは私の質問を読んだことがありますか?同じ振る舞いですが、違いは2つです。 –

答えて

1

はここで何が起こっているかの抽象例です。すべてのArray.prototypeメソッドは配列を返しません。たとえば、は元の配列を返しません。これは、あなたがやろうとしているものに似ている:

function foo_a(arr) { 
    // call foo, removes element from arr. 
    arr.foo() // We do not return here so the fact that foo returns 1 is not used. 
    return arr 
} 

function foo_b(arr) { 
    // call foo, removes element from arr. 
    return arr.foo() // We return the return value of foo here, which is 1 
} 

var arr = [1, 2, 3, 4]; 

foo_a(arr) // [1, 2, 3] 
foo_b(arr) // 1 

TL; DR return arr.foo()は基本的に関係なく、それが配列にし、これまで他に何の常に1である「FOOの戻り値を返す」と言っています。

+0

私の想像力はいいです。どうもありがとう! –

+0

@Happyコーディングに問題はありません。うれしいです!あなたが考えることができるもう一つの方法は、数字を返す以外の何もしない関数があると言うことです。その関数を別の関数でランダムに呼び出すと、戻り値が使用されないため効果的に何も実行されません。しかし、その関数を返すと、外部関数は戻り値を利用してその数値も返します。 – Damon

+0

スパゲッティのようなものです:( –

1

結果の配列は独自の配列です。それを元に戻す必要はありません。 だから、それだけで次のようになります。

var splice_a = function (array, index) { 
    array.splice(index, 1); 
    return array 
}; 
var array = [1, 2, 3, 4]; 

splice_a(array, 1); 
alert(array) //will show 1,3,4; 

splice_a(array, 1); 
alert(array) //will show 1,4; 
1

Array.prototype.splice配列として配列を返す取り除か値のmインデックスからnデータを削除します:あなたの状況にあるので、

var m = 2, 
 
    n = 3; 
 
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 
 
var removedValues = arr.splice(m, n); 
 

 
console.log(arr, removedValues);

それarray(indexの値)から1つの要素を削除し、それを新しい配列に返します。

// a function that removes the last element from an array, and returns 1 
Array.prototype.foo = function() { 
    this.pop() 
    return 1 
} 

// a function that removes the last element from an array, and returns the array 
Array.prototype.bar = function() { 
    this.pop() 
    return this 
} 

あなたは同じことがarrに起こるarr.foo()またはarr.bar()を呼ぶとしたら、あなたが求めている機能のしかし戻り値は異なります。

1

戻り値の違いを表示するように関数を変更しました。 両方同じ方法で渡された配列を変更します。変更されるのは戻り値だけです。これはあなたが混乱している場所かもしれません。array変数がsplice_aによって変更されてから、splice_bまで実行されていることに注意してください。それはとにかく変化している場合は、値を返すようにしたいと思う理由については

var splice_a = function (array, index) { 
 
    var removed = array.splice(index, 1); 
 
    console.log(` Removed = ${removed}`); 
 
    console.log(` Array = ${array}`); 
 
    
 
    return array; 
 
}; 
 

 
var splice_b = function (array, index) { 
 
    var removed = array.splice(index, 1) 
 
    console.log(` Removed = ${removed}`); 
 
    console.log(` Array = ${array}`); 
 
    
 
    return removed; 
 
}; 
 

 
var array = [1, 2, 3]; 
 

 
console.log(`Array before splice_a: ${array}`); 
 
splice_a(array, 1); 
 

 
console.log(`Array before splice_b: ${array}`); 
 
splice_b(array, 1); 
 

 
console.log(`Final value of array: ${array}`);

。これは主に連鎖コマンドの便宜のためです。ちょうど最初の関数を考えてみましょう:

var splice_a1 = function (array, index) { 
 
    var removed = array.splice(index, 1); 
 
    return array; 
 
}; 
 
var splice_a2 = function (array, index) { 
 
    var removed = array.splice(index, 1); 
 
}; 
 

 

 
var array = [1, 2, 3]; 
 
// This will run, because splice_a1 returns an array 
 
splice_a1(array, 1).forEach(_ => console.log(_)) 
 

 
// This will throw an error, because <undefined> does not have a forEach() 
 
splice_a2(array, 1).forEach(_ => console.log(_))

+0

あなたの事例を何度も読んできましたが、あなたの説明を理解していますが、私の例では「最終値」は「1」ではなく「3」です。 。 –

+0

私は 'alerts()'を削除しましたが、戻しても同じ結果が得られるでしょう。 'splice_b'が' removed'値を返していることを覚えておいてください3. – Malk

+0

ya。違いは 'splice_a'です。配列を返し、 'splice_b'が要素(' removed value')を返しています。右ですか? –

関連する問題