Tengo dos matrices simplificadas como esta.

var a = [{
 number: 1,
 name: "A"
}, {
 number: 2,
 name: "B"
}, {
 number: 3,
 name: "C"
}, {
 number: 4,
 name: "D"
}, {
 number: 5,
 name: "E"
}, {
 number: 6,
 name: "F"
}];

var b = [{
 number: 3,
 name: "C"
}, {
 number: 6,
 name: "F"
}];

Lo que quiero es devolver una matriz donde a se filtre contra b. Entonces el resultado es este.

var result = [{
 number: 1,
 name: "A"
}, {
 number: 2,
 name: "B"
}, {
 number: 4,
 name: "D"
}, {
 number: 5,
 name: "E"
}];

He visto muchas otras soluciones aquí en el desbordamiento de la pila, pero no puedo hacer que funcione.

Estoy de acuerdo con el uso de bibliotecas como guión bajo.

1
stibay 13 ene. 2017 a las 17:55

6 respuestas

La mejor respuesta
var a = [{
 number: 1,
 name: "A"
}, {
 number: 2,
 name: "B"
}, {
 number: 3,
 name: "C"
}, {
 number: 4,
 name: "D"
}, {
 number: 5,
 name: "E"
}, {
 number: 6,
 name: "F"
}];

var b = [{
 number: 3,
 name: "C"
}, {
 number: 6,
 name: "F"
}];

var _ = require('lodash');
var result = _.differenceBy(a,b,'name');

Para obtener más información, consulte la documentación de Lodash: https://lodash.com/docs/#differenceBy

2
Nidhin David 13 ene. 2017 a las 15:24

Puede hacer esto con javascript simple usando filter(), some() y every().

var a = [{"number":1,"name":"A"},{"number":2,"name":"B"},{"number":3,"name":"C"},{"number":4,"name":"D"},{"number":5,"name":"E"},{"number":6,"name":"F"}]
var b = [{"number":3,"name":"C"},{"number":6,"name":"F"}]

var result = a.filter(function(o) {
  return !b.some(function(e) {
    return Object.keys(o).length == Object.keys(e).length && Object.keys(o).every(function(k) {
      return e[k] == o[k]
    })
  })
})

console.log(result)
0
Nenad Vracar 13 ene. 2017 a las 15:09

Es posible lograr con lodash por la solución de una línea.

var a = [{
 number: 1,
 name: "A"
}, {
 number: 2,
 name: "B"
}, {
 number: 3,
 name: "C"
}, {
 number: 4,
 name: "D"
}, {
 number: 5,
 name: "E"
}, {
 number: 6,
 name: "F"
}];

var b = [{
 number: 3,
 name: "C"
}, {
 number: 6,
 name: "F"
}];

var result = _.differenceWith(a, b, _.isEqual);

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
6
Maxim Kuzmin 13 ene. 2017 a las 15:08
var v1 = JSON.parse(a);
var v2 = JSON.parse(b);

var v3 = [] ;


function objectEquals(v1, v2) {

    if (typeof(v1) !== typeof(v2)) {
        return false;
    }
if (v1 instanceof Object && v2 instanceof Object) {

  for (k in v1) {
            r = objectEquals(v1[k], v2[k]);
            if (!r) {
              v3.push(v1[k]);  

            }
        }



}

}

// call the above method passing your two object, and return a new unique array


objectEquals(v1, v2) ;
0
Bhabani P 13 ene. 2017 a las 15:18

Puede usar Array # filter. Algo como eso:

const filterData = (a,b) => {
    return a.filter( (itemA) => {
        return b.some( (itemB) => { 
            return (itemA.number === itemB.number); 
         });
  });
}

Acabo de crear un violín para probar el código: https://jsfiddle.net/mrlew/pb1qqeyd/3 / (tendrás que abrir la consola para verificar los resultados).

O ... en una línea:

const filterData = (a,b) => a.filter( (itemA) => b.some( (itemB) => (itemA.number === itemB.number) ) );

EDITAR : gracias a las sugerencias de @kzh, editadas para usar . some .

2
mrlew 13 ene. 2017 a las 16:11

Puede usar la función filter incorporada en JavaScript para filtrar una matriz con otra matriz, consulte el fragmento de código a continuación.

var a = [{
  number: 1,
  name: "A"
}, {
  number: 2,
  name: "B"
}, {
  number: 3,
  name: "C"
}, {
  number: 4,
  name: "D"
}, {
  number: 5,
  name: "E"
}, {
  number: 6,
  name: "F"
}];

var b = [{
  number: 3,
  name: "C"
}, {
  number: 6,
  name: "F"
}];

var result = a.filter(function(currentValue, index, arr) {
  var found = false;
  for (var i = 0; i < b.length; i++) {
    if (currentValue.number === b[i].number) {
      found = true;
      break;
    }
  }

  if (!found) {
    return currentValue;
  }
});

console.log(result);
1
Abdul Mateen Mohammed 13 ene. 2017 a las 15:20