2017-11-14 9 views
1

配列を既存の配列にプッシュする不変の方法を試みていますが、何とか私のコードが機能していません。プッシュなしで配列に項目を追加する

function insertItem(array, action) { 
    return [ 
    ...array.slice(0, action.index), 
    action.item, 
    ...array.slice(action.index) 
    ] 
} 

const ori_arr = [{ 
    id: 1, 
    name: 'james', 
    age: 10 
}, { 
    id: 2, 
    name: 'terrance', 
    age: 20 
}] 

console.log(insertItem(ori_arr, { 
    action: { 
    index: 1, 
    item: { 
     id: 3, 
     name: 'she', 
     age: 44 
    } 
    } 
})) 

おそらくインデックス部分で間違っています。

+3

ない100%に私はあなたが使用したいと思います信じているのに、私は、あなたが達成しようとしているかを理解してください 'action.action.index'をあなたの機能を変更することです'action.index'は存在しないためです。 – Chris

+1

うん、関数呼び出しの '{action:...}'が多すぎる。あなたはちょうど '{index:1、item:...}'を書くだけです。 –

+0

しかし、新しい配列を持っていても、浅いコピーを実行していることに注意することは非常に重要です。 –

答えて

2

追加するオブジェクトにネストされたプロパティactionがあるため、actionキーを取得するには、inserItemの引数としてdestructuringを使用します。

const insertItem = (array, { action }) => [ 
 
    ...array.slice(0, action.index), 
 
    action.item, 
 
    ...array.slice(action.index), 
 
]; 
 

 
const ori_arr = [{ 
 
    id: 1, 
 
    name: 'james', 
 
    age: 10 
 
}, { 
 
    id: 2, 
 
    name: 'terrance', 
 
    age: 20 
 
}] 
 

 
console.log(insertItem(ori_arr, { 
 
    action: { 
 
    index: 1, 
 
    item: { 
 
     id: 3, 
 
     name: 'she', 
 
     age: 44 
 
    } 
 
    } 
 
}))

Hoveverあなたがdestructuringを避けるために好むならば、ちょうど例えばためinsertItem機能であなたの第二引数の名前を変更しますobjその後、ちょうどあなたの関数内のすべてのaction.indexobjを追加します。

const insertItem = (array, obj) => [ 
    ...array.slice(0, obj.action.index), 
    obj.action.item, 
    ...array.slice(obj.action.index), 
]; 
+1

ああ、それを見ていない、ありがとう。 –

+0

ここで問題はありますか?注文はどのように機能していますか?新しい項目が最後の項目にプッシュされたか、または中央にありますか? –

+0

@ JaneEmeliaはい、元の配列を '(0、1)'でスライスしているので、新しいオブジェクトを挿入して元の配列の欠けている部分を追加しています。最後に追加したい場合は '[... array、action.item]'が必要です。 –

0

あなたは間違ってパラメータを渡している:

console.log(insertItem(ori_arr, { 
    index: 1, 
    item: { 
     id: 3, 
     name: 'she', 
     age: 44 
    } 
})) 

console.log(insertItem(ori_arr, { 
    action: { 
    index: 1, 
    item: { 
     id: 3, 
     name: 'she', 
     age: 44 
    } 
    } 
})) 

ではなくactionオブジェクトずにそれを渡しますあなたがログを記録しようとすると、あなたの関数の中にそれが見えるでしょうinsertItemあなたはparam呼び出しを持っていますエドactionは、それは(あなたがそれを呼び出すとき)あなたはaction.itemにアクセスしようとすると、それが存在しない

action = { action: { index: 1, item: { id: 3, name: 'she', age: 44 }}}

ある値です。ない -

別の解決策は、

function insertItem(array, action) { 
    return [ 
    ...array.slice(0, action.action.index), 
    action.action.item, 
    ...array.slice(action.action.index) 
    ] 
} 
+0

ここにスライスが必要な場合はありますか?通常、ユーザーが何かを追加するためにボタンをクリックしたときに、新しい項目をリストの先頭または最後に押しますか? –

関連する問題