2017-04-25 9 views
2

Ich versuche, ein Array von Daten und Werten zu einem Array von Daten zu verbinden, ohne die zusätzlichen Daten herauszufiltern. Die LinqJS-Referenz here ist ziemlich verwirrend darüber, wie ich den Join tatsächlich verwenden würde. Die Frage hat auch nicht viel geholfen.Linq JS Join-Syntax

bearbeiten:

Dokumentation Join hier: https://svschmidt.github.io/linqjs/Collection.html#Join

Es sieht aus wie ich brauche Hilfe Aussortieren, wie die Verbindung zu bekommen ein outer zu sein und nicht ein inner beitreten, so dass es null/undefinierte Werte enthält .

Sagen, ich habe zwei Arrays:

Array 1:

[ 
'2017-02-10', 
'2017-02-11', 
'2017-02-12', 
'2017-02-13', 
'2017-02-20', 
'2017-02-21', 
'2017-02-22', 
'2017-02-23', 
'2017-02-24', 
'2017-02-25', 
'2017-02-26', 
'2017-02-27' 
] 

Array 2:

[ 
    { date: '2017-02-10', value: 5 }, 
    { date: '2017-02-12', value: 8 }, 
    { date: '2017-02-13', value: 13 }, 
    { date: '2017-02-21', value: 14 }, 
    { date: '2017-02-24', value: 11 }, 
    { date: '2017-02-27', value: 7 } 
] 

Ich möchte sie verbinden, damit ich dies als mein Ergebnis zu erhalten (- für undefined):

[ 
'5', 
-, 
'8', 
'13', 
-, 
'14', 
-, 
-, 
'11', 
-, 
-, 
'7' 
] 

Meine aktuelle Syntax:

Enumerable.from(array1).join(array2, '$', '$.date', "outer, inner => inner.value").toArray() 

Dies führt zu einer Reihe von Werten, aber die Ergebnisse sind noch innere verbunden, und es herausfiltert, was die null/undefined Elemente sein könnte.

Wie kann ich das tun? Wie funktioniert die Join-Syntax für LinqJS?

+0

Sie können nicht beide Arrays verbinden, weil ihr Inhalt unterscheidet. Sie können sie jedoch in ein endgültiges neues Array umwandeln. – MaxZoom

+0

Benötigen Sie Linq oder Vanille js ist auch OK? – Vovan

+0

Ich denke, du meinst diese Bibliothek: https://github.com/SvSchmidt/linqjs, ich bevorzuge das Aussehen von Githubs Readmes;) – niceman

Antwort

2

Ich bin nicht sicher über LinqJS, aber regelmäßige JS ist mehr als fähig, dies zu tun.

Es gibt ein paar Wege, um darüber zu gehen. Die Funktionen reduce(), map() und sort() sind sehr Linq-esque und funktionieren gut nativ. (Es gibt auch filter() und eine Reihe von anderen).

const dates = [ 
 
'2017-02-10', 
 
'2017-02-11', 
 
'2017-02-12', 
 
'2017-02-13', 
 
'2017-02-20', 
 
'2017-02-21', 
 
'2017-02-22', 
 
'2017-02-23', 
 
'2017-02-24', 
 
'2017-02-25', 
 
'2017-02-26', 
 
'2017-02-27' 
 
] 
 

 
const data = [ 
 
    { date: '2017-02-10', value: 5 }, 
 
    { date: '2017-02-12', value: 8 }, 
 
    { date: '2017-02-13', value: 13 }, 
 
    { date: '2017-02-21', value: 14 }, 
 
    { date: '2017-02-24', value: 11 }, 
 
    { date: '2017-02-27', value: 7 } 
 
]; 
 

 
const result = dates 
 
    .map(date => ({ date, value: '-' })) 
 
    .concat(data) 
 
    .filter(({ date, value }) => !(data.find(d => d.date === date) && value === '-')) 
 
    .sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()); 
 

 
console.log(result); 
 

 
const justValues = Object.keys(result).map(key => result[key].value); 
 

 
console.log(justValues);

+0

Es ist gut zu zeigen, dass Vanille JS fähig ist (oder zumindest nicht so schlecht wie man denken könnte) – niceman

+0

Danke Sam, aber ich bin auf der Suche nach LinqJS . Ich kann das JS schreiben, um das ziemlich einfach zu tun (ich habe bereits funktionierenden Code für dieses Problem), aber ich bin mehr daran interessiert zu lernen, wie man diese Aufgabe mit dieser spezifischen Bibliothek durchführt. Dies ist weniger die Frage "Wie bekomme ich dieses Ergebnis durch irgendwelche Mittel?", Sondern eher die Frage "Wie bekomme ich dieses Ergebnis mit diesem spezifischen Rahmen". Wenn das Sinn macht. –

+0

Ja, ich habe deinen Kommentar gesehen, nachdem ich meine Antwort gepostet habe. – samanime

3

könnten Sie GroupJoin

die Elemente von zwei Sequenzen verwenden basierend korreliert die Ergebnisse auf Gleichheit der Schlüssel und Gruppen. Der standardmäßige Gleichheitsvergleich wird zum Vergleichen von Schlüsseln verwendet.

für eine linke OUTER JOIN und den gewünschten Wert angeben und DefaultIfEmpty

Gibt die Elemente der angegebenen Sequenz oder dem angegebenen Wert in einer Singletonauflistung verwenden, wenn die Sequenz leer ist.

mit dem gewünschten Ersatz, wenn Null.

var dates = ['2017-02-10', '2017-02-11', '2017-02-12', '2017-02-13', '2017-02-20', '2017-02-21', '2017-02-22', '2017-02-23', '2017-02-24', '2017-02-25', '2017-02-26', '2017-02-27'], 
 
    values = [{ date: '2017-02-10', value: 5 }, { date: '2017-02-12', value: 8 }, { date: '2017-02-13', value: 13 }, { date: '2017-02-21', value: 14 }, { date: '2017-02-24', value: 11 }, { date: '2017-02-27', value: 7 }], 
 
    result = Enumerable 
 
     .From(dates) 
 
     .GroupJoin(
 
      values, 
 
      '', 
 
      '$.date', 
 
      't, u => ({ date: t, value: u.Select("$.value").DefaultIfEmpty("-").ToString() })') 
 
     .ToArray(); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.js"></script>

ES6

var dates = ['2017-02-10', '2017-02-11', '2017-02-12', '2017-02-13', '2017-02-20', '2017-02-21', '2017-02-22', '2017-02-23', '2017-02-24', '2017-02-25', '2017-02-26', '2017-02-27'], 
 
    values = [{ date: '2017-02-10', value: 5 }, { date: '2017-02-12', value: 8 }, { date: '2017-02-13', value: 13 }, { date: '2017-02-21', value: 14 }, { date: '2017-02-24', value: 11 }, { date: '2017-02-27', value: 7 }], 
 
    result = Enumerable 
 
     .From(dates) 
 
     .GroupJoin(
 
      values, 
 
      '', 
 
      '$.date', 
 
      (t, u) => ({ 
 
       date: t, 
 
       value: u.Select("$.value").DefaultIfEmpty("-").ToString() 
 
      })) 
 
     .ToArray(); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.js"></script>