2016-07-05 11 views
0

Ich habe einfachen Code, der mir verwandten Produkt basierend auf Tags anzeigen kann, aber ich möchte diesen Code erweitern, das kann ich mehr als ein Tag eingeben. In diesem Moment kann ich nur laufen:Get Element von Array nach Wert in Javascript

Und ich habe jedes Produkt mit 'Tag1' in ihren Tags. In diesem Fall name1 und name2.

var products = [ 
    { 
    name: 'name1', 
    tags: ['tag1', 'tag2', 'tag3'], 
    }, 
    { 
    name: 'name2', 
    tags: ['tag1', 'tag3', 'tag4', 'tag5'], 
    }, 
    { 
    name: 'name3', 
    tags: ['tag2', 'tag5', 'tag6'], 
    } 

]; 

var finalHtml = ""; 

function category(tag) { 
    return products.filter(function(product){ 
    if (~product.tags.indexOf(tag)) { 
     finalHtml += '<li>' + product.name + '</li>'; 
     document.getElementById("related_prod").innerHTML = finalHtml; 
    } 
    }); 
} 

Was ich erwarte?

Wenn ich diesen Code ausführen wird:

<script type="text/javascript">category('tag1, tag6');</script> 

Ich möchte jedes Produkt sehen, die tag1 OR tag2 in ihren Tags hat. In diesem Fall sollte es name1 und name3 sein.

+0

Das macht nicht viel Sinn. name3 hat kein tag1, also wenn du nach Produkten mit tag1 UND tag2 in ihren Tags suchst, bekommst du nur name1, nicht name3 – Cameron637

+0

Aber mit tag6 würde ich gerne Produkte sehen, die tag1 und tag6 in ihren Tags haben . Name3 erfüllt diese Bedingung. – user3041764

+0

Aber name1 nicht? Es ist wahrscheinlich nur ein Tippfehler in Ihrem Fragecode und ich verstehe jetzt, dass Sie mit "AND" -Logik nicht "ODER" suchen wollen, aber ich würde vorschlagen, sie zu bearbeiten und sicherzustellen, dass es keine Tippfehler für zukünftige Leser gibt. – Cameron637

Antwort

1

Hier wird eine Lösung mit ECMAScript2015:

var products = [ 
 
    { 
 
    name: 'name1', 
 
    tags: ['tag1', 'tag2', 'tag3'], 
 
    }, 
 
    { 
 
    name: 'name2', 
 
    tags: ['tag1', 'tag3', 'tag4', 'tag5'], 
 
    }, 
 
    { 
 
    name: 'name3', 
 
    tags: ['tag2', 'tag5', 'tag6'], 
 
    } 
 
]; 
 

 
function category(...tags) { 
 
    let related = document.getElementById("related_prod"); 
 
    // clear output 
 
    related.innerHTML = ''; 
 
    // turn array values into object properties for faster lookup 
 
    tags = tags.reduce((tags, tag) => (tags[tag] = 1, tags), {}); 
 
    // find products that have at least one of the tags 
 
    products.filter(product => product.tags.some(tag => tags[tag])) 
 
      // display the names of the found products 
 
      .forEach(product => { 
 
       let li = document.createElement('li'); 
 
       li.textContent = product.name; 
 
       related.appendChild(li); 
 
      }); 
 
} 
 

 
category('tag4','tag5');
<ul id="related_prod"></ul>

1

Dies kann mor allgemein wie ich von Ihrer Anforderung verstehen Sie „oder“ nicht „und“ so die Antwort gesucht werden kann:

function category() { 
    var args = Array.prototype.slice.call(arguments); 
    return products.filter(function(product){ 
    args.forEach(function(arg){ 
    if (product.tags.indexOf(arg)> -1) {// readability 
     finalHtml += '<li>' + product.name + '</li>'; 
     document.getElementById("related_prod").innerHTML = finalHtml; 
    } 
    }) 
    }); 
} 

bearbeiten: Für eine bessere Lösung, die eine gute Trennung haben und lesbar ein (vorausgesetzt, Sie ECMAScript5 Shim verwenden)

function findProducts(){ 
    var args = Array.prototype.slice.call(arguments); 
    var foundProducts = []; 
    products.forEach(function(product) { 
     args.forEach(function(arg){ 
      if(product.tags.indexOf(arg) > -1 && foundProdutcs.indexOf(product) == -1) 
       foundProducts.push(product); 
     } 
    }); 
    return foundProducts; 

} 
function doSomethingWithTheProducts() { 
    var products = findProducts.apply(this,arguments); 
    var finalHtml = ""; 
    products.forEach(function(product){ 
     finalHtml += "<li>" + product.name + "</li">; 
    }); 
    document.getElementById("related_prod").innerHTML = finalHtml; 
} 

doSomethingWithTheProducts('tag1','tag2'); 
+0

Es funktioniert fast perfekt. Problem ist die Duplizierungsposition, wenn sie mehrere Bedingungen erfüllt. Sollte ich Schlüssel zur Liste hinzufügen (die nicht duplizieren) und schließlich das Ergebnis anzeigen? Ist das eine gute Lösung für dieses Problem? – user3041764

+0

Dies ist eigentlich keine gute Lösung, Sie sollten die Suche und HTML-Methoden getrennt teilen. Ich werde meine Antwort jetzt bearbeiten –