2016-04-26 1 views
3

Ich mache eine MEAN Stack-Anwendung, und versuche, eine Datenbank von Unternehmen zu erstellen - die ein leeres Array erfordert, um neue Instanzen des Business-Modells zu schieben.Empty Arrays und Sortierung Pushed Keys JavaScript

Ich möchte dann den Index der Unternehmen basierend auf zwei der Schlüssel "Name" (alphabetisch) und "upVotes" sortieren. Hier

ist, was ich in meiner Business.Service-Datei (Client-Seite) haben:

var service = { 
    create: create, 
    businesses: [], 
    upVote: upVote, 
    showAllBiz: showAllBiz, 

}; 
function showAllBiz(){ 
    $http.get("/api/businesses") 
    .then(function(res) { 
    service.businesses = res.data; 
    }, function(err) { 
     $log.info(err); 
    }); 
} 
function create(data) { 
    return $http({ 
    method: 'POST', 
    url: '/api/businesses', 
    data: data, 
    headers: { 
     'Content-Type': 'application/json' 
    } 
    }).then(function(res) { 
     service.businesses.push(res.data); 
    }); 
} 

Ich habe auch versucht() auf dem hinteren Ende zu sortieren, ohne Ergebnisse. Hier ist, wie das aussieht:

var Business = require("../models/business"); 
var nodemailer = require("nodemailer"); 
var transporter = nodemailer.createTransport(); 
var firstBy  = require("thenby"); 

function index(req, res) { 
if(req.query.search){ 
    Business.find({}).then(function(data) { 
    var reg = new RegExp(req.query.search, "i"); 
    data = data.filter(function(biz) { 
    if(reg.test(biz.name)) return biz 
    }) 

    res.json(data); 
    }, function(err) { 
    res.json(err); 
}); 
} else{ 
    Business.find({}).then(function(data) { 
    res.json(data); 
    }, function(err) { 
    res.json(err); 
    }); 
} 
} 


function create(req, res) { 
var business  = new Business(); 

console.log(req.body); 
business.name    = req.body.name; 
business.address1   = req.body.address1; 
business.address2   = req.body.address2; 
business.email    = req.body.email; 
business.twitterHandle  = req.body.twitterHandle; 
business.upVote   = req.body.upVote; 

business.save(function(err, savedBusiness) { 
if (err) { 
    res.send(err) 
} 

res.json(savedBusiness); 
}); 

ich auf der Tatsache, steckte immer, dass ich das leere Array für die neuen Instanzen muß (in meinen Diensten), aber ich brauche auch die Verwendung der Objekte innerhalb des Arrays zu machen in der .sort() - Methode, um auf die Schlüssel zuzugreifen (die ich sortieren möchte).

Ich spielte mit Teun thenBy.js, aber war ein bisschen aus meiner Tiefe.

Ich habe geortet Sortieren von Arrays und Arrays von Objekten, aber das sind alle Beispiele für das Sortieren von Informationen, die vorhanden sind, nicht Informationen, die noch nicht existiert, so dass das leere Array erforderlich.

+0

touche @halfer! – savageblackout

+0

':-)'. Falls Ihnen das nicht bekannt ist, werden Redakteure manchmal einen Beitrag lesen und nicht wesentliche Teile davon zurechtschneiden und/oder ihn lesbarer machen. Hier gab es nicht viel zu reparieren! – halfer

+1

süß! Danke für die Info :-) – savageblackout

Antwort

1

Angenommen, ich verstehe die Frage, hier ist der Kern davon mit einigen erfundenen Daten. Ich habe die Sortierfunktion etwas verbaler gelassen, um (hoffentlich) die Lesbarkeit zu erhöhen.

Beachten Sie, dass wir in der Sorter-Methode zuerst name, dann upVotes vergleichen und danach nur 0 zurückgeben, um die Objektgleichheit zu kennzeichnen. Da wir name zuerst vergleichen, gefolgt von upVotes, entspricht dies der Sortierung nach name, dann upVotes.

let arr = [ 
    { id: 1, name: 'Dominos', upVotes: 21 }, 
    { id: 2, name: 'Pizza Hut', upVotes: 31 }, 
    { id: 3, name: 'Pizza Hut', upVotes: 35 }, 
    { id: 4, name: 'Dominos', upVotes: 61 }, 
    { id: 5, name: 'Dominos', upVotes: 2 }, 
    { id: 6, name: 'Pizza Hut', upVotes: 25 }, 
    { id: 7, name: 'Dominos', upVotes: 10 }, 
    { id: 8, name: 'Pizza Hut', upVotes: 3 } 
]; 

function sorter(a, b) { 
    if (a.name > b.name) 
     return 1; 
    if (a.name < b.name) 
     return -1; 
    if (a.upVotes > b.upVotes) 
     return 1; 
    if (a.upVotes < b.upVotes) 
     return -1; 
    return 0; 
} 

arr.sort(sorter); 

console.log(arr); 
/* [ { id: 7, name: 'Dominos', upVotes: 2 }, 
    { id: 8, name: 'Dominos', upVotes: 10 }, 
    { id: 5, name: 'Dominos', upVotes: 21 }, 
    { id: 6, name: 'Dominos', upVotes: 61 }, 
    { id: 4, name: 'Pizza Hut', upVotes: 3 }, 
    { id: 3, name: 'Pizza Hut', upVotes: 25 }, 
    { id: 1, name: 'Pizza Hut', upVotes: 31 }, 
    { id: 2, name: 'Pizza Hut', upVotes: 35 } ] */ 

[].sort(sorter); // no errors. if the array is empty, the callback will never be run. 
+0

brilliant! @dvlsg das funktioniert mit dem Array mit fabrizierten Daten. Die Konsole wird in der entsprechenden Reihenfolge protokolliert. Jetzt möchte ich dies für die service.businesses implementieren (das leere Array, in das die erstellten Unternehmen hineingeschoben werden), aber mit einem leeren Array enden. Das ist der Teil, der mir unklar ist. Wie ordne ich das Array an, für das keine Daten erstellt wurden? – savageblackout

+0

Ich brauche vielleicht noch eine weitere Klarstellung - sind Sie besorgt über Fehler, die beim Sortieren eines leeren Arrays ausgelöst werden, oder sind Sie besorgt über Situationen, in denen bestimmte Schlüssel ('name',' upVotes') noch nicht definiert sind? Könnte helfen, ein genaues Beispiel dessen zu sehen, was Sie in "service.businesses" zum Zeitpunkt der Sortierung erwartet haben. – dvlsg

+0

das Modell für Unternehmen ist 'var businessSchema = new mongoose.Schema ({ Name: {type: String}, address1: {type: String}, address2: {type: String}, E-Mail: {type : String, erforderlich: false}, twitterHandle: {type: String, erforderlich: false}, upVote: {type: Number, default: 0}, upVoters: [{type: String}] }); ' , so dass die service.businesses die neuen Unternehmen enthalten, die mit diesen Schlüsseln zur Datenbank hinzugefügt werden. – savageblackout