saber recorrer objetos matriz existe elementos elemento dentro contar buscar array agregar javascript arrays angularjs lodash

matriz - recorrer array de objetos javascript



¿Usando lodash push a una matriz solo si el valor no existe? (8)

Estoy tratando de hacer una matriz que, si no existe un valor, se agregue, pero si el valor está allí, me gustaría eliminar ese valor de la matriz también.

Se siente como Lodash debería poder hacer algo como esto.

Estoy interesado en sus sugerencias de mejores prácticas.

También vale la pena señalar que estoy usando Angular.js

* Actualización *

if (!_.includes(scope.index, val)) { scope.index.push(val); } else { _.remove(scope.index, val); }


El uso includes función para verificar que el elemento existe en la matriz y remove para eliminar el elemento existente.

function addOrRemove(arr, val) { if (!_.includes(arr, val)) { arr.push(val); } else { _.remove(arr, item => item === val); } console.log(arr); } var arr = [1, 2, 3]; addOrRemove(arr, 1); // arr = [2, 3] addOrRemove(arr, 4); // arr = [2, 3, 4] addOrRemove(arr, 2); // arr = [3, 4]

<script src="https://raw.githubusercontent.com/lodash/lodash/4.11.2/dist/lodash.min.js"></script>



Este forro único debería hacer el trabajo. Si el elemento a insertar no existe, inserta el elemento y devuelve la longitud de la matriz resultante. Si existe un elemento en la matriz, elimina el elemento y devuelve el elemento eliminado en una matriz separada.

var arr = [1,2,3,4,5], aod = (a,e,i=0) => !!~(i = a.indexOf(e)) ? a.splice(i,1) : a.push(e); document.write("<pre>" + JSON.stringify(aod(arr,6)) + JSON.stringify(arr) + "</pre>"); document.write("<pre>" + JSON.stringify(aod(arr,6)) + JSON.stringify(arr) + "</pre>");

Bueno, en realidad odio el impulso, ya que devuelve el valor de longitud de matriz resultante, que la mayoría de las veces es inútil. Preferiría tener una referencia a la matriz resultante que se devolverá para que pueda encadenar las funciones. En consecuencia, una forma simple de lograrlo es;

var arr = [1,2,3,4,5], aod = (a,e,i=0) => !!~(i = a.indexOf(e)) ? a.splice(i,1) : (a.push(e),a); document.write("<pre>" + JSON.stringify(aod(arr,6)) + JSON.stringify(arr) + "</pre>"); document.write("<pre>" + JSON.stringify(aod(arr,6)) + JSON.stringify(arr) + "</pre>");

Así que ahora esto es razonablemente encadenable.


La forma más sencilla de hacer esto es usar las funciones _.isEmpty y _.remove Lodash:

if (_.isEmpty(_.remove(array, value)) { array.push(value); }

Después de eliminar, la función devolverá valores eliminados o una matriz vacía, y si devuelve una matriz vacía, agregaremos un nuevo valor.


La función Set introducida por ES6 haría exactamente eso.

var s = new Set(); // Adding alues s.add(''hello''); s.add(''world''); s.add(''hello''); // already exists // Removing values s.delete(''world''); var array = Array.from(s);

O si desea seguir usando matrices regulares

function add(array, value) { if (array.indexOf(value) === -1) { array.push(value); } } function remove(array, value) { var index = array.indexOf(value); if (index !== -1) { array.splice(index, 1); } }

Usar vanilla JS sobre Lodash es una buena práctica. Elimina una dependencia, lo obliga a comprender su código y, a menudo, es más eficiente.


Puedes usar _.union

_.union(scope.index, [val]);


Quizás _.pull() pueda ayudar:

var _ = require(''lodash''); function knock(arr,val){ if(arr.length === _.pull(arr,val).length){ arr.push(val); } return arr; }

Muta la matriz existente, elimina también los duplicados:

> var arr = [1,2,3,4,4,5]; > knock(arr,4); [ 1, 2, 3, 5 ] > knock(arr,6); [ 1, 2, 3, 5, 6 ] > knock(arr,6); [ 1, 2, 3, 5 ]


Si no necesita admitir IE, o si está utilizando polyfills, puede usar Array.prototype.includes()

const addUniq = (array, value) => array.includes(value) ? array.length : array.push(value);