2017-10-12 4 views
0

Ich habe ein ArrayArray Suche über Array von Objekten - Javascript

var arr = ['0333', '0444', '0334']; 

Und ich habe ein Array von Objekten.

var objArray = [{'name':'abc', 'phone':'0333'}, 
       {'name':'xyz', 'phone':'0334'}, 
       {'name':'fgfh', 'phone':'0999'}, 
       {'name':'abc', 'phone':'0666'}, 
       {'name':'abc', 'phone':'0444'} 
       ] 

Jetzt möchte ich für alle arr Werte/Indizes in objArray und separate Objekte mit Anpassung um eine Suche machen Werte, und trennen mit keine passende Werte

var matchingArray = []; 
var noMatchingArray = []; 
for (var i = 0; i < arr.length; i++) { 
     for (var j = 0; j < objArray.length; j++) { 
      if(objArray[j]['phone'] == arr[i]){ 
       matchingArray.push(objArray); 
      } 
     } 
} 

Wie ich hinzufügen keine passenden Objekte zu noMatchingArray?

+0

Was ist das erwartete Ergebnis für 'matchingArray' und 'noMatchingArray'? – PeterMader

+1

'else {noMatchingArray.push (objArray [j]); } ', sowie' matchingArray.push (objArray [j]); 'in der vorhergehenden Zeile. –

Antwort

6

Dies sollte funktioniert

objArray.forEach(item => arr.indexOf(item.phone) >=0 ? matchingArray.push(item) : noMatchingArray.push(item)) 
+1

Warum verwenden Sie Karte? schlechte Wahl – epascarello

+0

@epascarello Ja, du hast Recht. Geändert in 'forEach' – guest

+0

' Array.prototype.includes' funktioniert nicht in IE. Es könnte besser sein, einfach bei 'indexOf' zu bleiben. –

-1

Zu allererst Ihre vorhandenen Loops ändern und eine break-Anweisung hinzufügen. Wenn ich den Zweck Ihres Übereinstimmungsalgorithmus nicht falsch verstehe, möchten Sie nicht mehr nach einer Übereinstimmung für diese Telefonnummer suchen, wenn Sie bereits eine Übereinstimmung gefunden haben.

Außerdem denke ich, Sie haben einen Fehler in Ihrem Code. Du willst das ObjArray nicht in das MatchingArray schieben, oder? Nur das matchedObject -> j

Beantworten Sie Ihre Frage. Ich würde mit einer zweiten Schleife arbeiten, die über alle Objekte im objArray schaut, und diejenigen, die nicht im Array matchingArray sind, zum noMatchingArray schieben.

var matchingArray = []; 
    var noMatchingArray = []; 
    for (var i = 0; i < arr.length; i++) { 
      for (var j = 0; j < objArray.length; j++) { 
       if(objArray[j]['phone'] == arr[i]){ 
        matchingArray.push(objArray[j]); 
        break; 
       } 
      } 
    } 

    for (var j = 0; j < objArray.length; j++) { 
     var marked = false; 
     for (var i = 0; i < matchingArray.length; i++) { 
      if (objArray[j] === matchingArray[i]) { 
       marked = true; 
       break; 
      } 
     } 
     if(!marked){ 
      noMatchingArray.push(objArray[j]); 
     } 
    } 

noch besser: die Kombination von beiden Schleifen wieder zusammen, während Schalt inneren und äußeren Aussehen Ihres anfänglichen Algorithmus macht es noch besser lesbar und schneller als meine erste Lösung.

var matchingArray = []; 
var noMatchingArray = []; 
for (var j = 0; j < objArray.length; j++) { 
    var marked = false; 
    for (var i = 0; i < arr.length; i++) { 
      if(objArray[j]['phone'] == arr[i]){ 
       matchingArray.push(objArray[j]); 
       marked = true; 
       break; 
      } 
    } 
    if(!marked){ 
     noMatchingArray.push(objArray[j]); 
    } 
} 
+1

Siehe akzeptierte Antwort. Ein Liner-Ansatz gegen Tonnen von Linien. –

+0

Okay. Danke für deine Antwort. – Andre

-1
function SearchArray() { 
    var arr = ['0333', '0444', '0334']; 
    var objArray = [{ 'name': 'abc', 'phone': '0333' }, 
    { 'name': 'fgfh', 'phone': '0999' }, 
    { 'name': 'abc', 'phone': '0666' }, 
    { 'name': 'abc', 'phone': '0444' } 
    ]; 

    var matchingArray = []; 
    var noMatchingArray = []; 
    for (var i = 0; i < arr.length; i++) { 
     var isFound = false; 
     for (var j = 0; j < objArray.length; j++) { 
      if (objArray[j]['phone'] == arr[i]) { 
       matchingArray.push(objArray[j]); 
       isFound = true; 
       break; 
      } 
     } 
     if (!isFound) 
     { 
      noMatchingArray.push(arr[i]); 
     } 
    } 
} 
0

können Sie verwenden Array.prototype.map() MDN mit normaler Nierenfunktion oder arrow Funktion.

Die Methode map() erstellt ein neues Array mit den Ergebnissen des Aufrufs einer bereitgestellten Funktion für jedes Element im aufrufenden Array.

noraml Karte ohne ES6

var arr = ['0333', '0444', '0334'], 
 
    objArray = [{ 
 
      'name': 'abc', 
 
      'phone': '0333' 
 
     },{ 
 
      'name': 'xyz', 
 
      'phone': '0334' 
 
     },{ 
 
      'name': 'fgfh', 
 
      'phone': '0999' 
 
     },{ 
 
      'name': 'abc', 
 
      'phone': '0666' 
 
     },{ 
 
      'name': 'abc', 
 
      'phone': '0444' 
 
     } 
 
    ]; 
 
var rec='',res = arr.map(function(val){ 
 
    rec = objArray.find(function(obj){return obj.phone == val}); 
 
    if (rec) { 
 
     return rec; 
 
    } 
 
}); 
 
console.log(res);

In ES6

const arr = ['0333', '0444', '0334'], 
 
    objArray = [{ 
 
      'name': 'abc', 
 
      'phone': '0333' 
 
     },{ 
 
      'name': 'xyz', 
 
      'phone': '0334' 
 
     },{ 
 
      'name': 'fgfh', 
 
      'phone': '0999' 
 
     },{ 
 
      'name': 'abc', 
 
      'phone': '0666' 
 
     },{ 
 
      'name': 'abc', 
 
      'phone': '0444' 
 
     } 
 
    ]; 
 
let res = arr.map(val => { 
 
    let rec = objArray.find(obj => obj.phone == val); 
 
    if (rec) { 
 
     return rec; 
 
    } 
 
}); 
 
console.log(res);

Verwandte Themen