Intento hacer una forma inmutable de insertar una matriz en una matriz existente, pero de alguna manera mi código no funciona.

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
    }
  }
}))

Posiblemente equivocada en la parte de índice.

1
Jane Emelia 14 nov. 2017 a las 12:53

2 respuestas

La mejor respuesta

Dado que el objeto que desea agregar tiene una propiedad anidada action, es posible que desee usar destructuring para obtener solo la clave action como argumento de su función inserItem.

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
    }
  }
}))

Coloca el cursor sobre , si prefieres evitar destructuring, simplemente cambia el nombre de tu segundo argumento en la función insertItem por ej. obj y luego simplemente agregue obj antes de cada action.index en su función:

const insertItem = (array, obj) => [
   ...array.slice(0, obj.action.index),
   obj.action.item,
   ...array.slice(obj.action.index),
];
2
kind user 14 nov. 2017 a las 09:58

Estás pasando los parámetros incorrectamente:

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

En su lugar, páselo sin el objeto action:

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

Si intenta registrarlo, verá que dentro de su función insertItem tiene un parámetro llamado action, su valor (cuando lo llama) es

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

Así que cuando intentas acceder a action.item no existe.

Otra solución sería cambiar tu función a

function insertItem(array, action) {
  return [
    ...array.slice(0, action.action.index),
    action.action.item,
    ...array.slice(action.action.index)
  ]
}
0
Ante Jablan Adamović 14 nov. 2017 a las 10:00