2017-04-25 19 views
2

追加の日付を除外せずに日付と値の配列を日付の配列に結合しようとしています。 LinqJSリファレンスhereは、実際にどのように私が実際に結合を使用するかについてかなり混乱しています。質問hereはあまり役に立たなかった。Linq JS join syntax

編集

ここにドキュメントを参加:https://svschmidt.github.io/linqjs/Collection.html#Join

それは私が取得する方法を整理する助けが必要なようouterなくinnerは、それがnull /未定義の値が含まれて参加する参加に見えます。

は、私は2つの配列を持っていると言う:

アレイ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' 
] 

アレイ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 } 
] 

私はそれらを結合したいので、私は私の結果としてこれを取得します(-undefined):

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

私の現在の構文:

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

これは、値の配列になりますが、結果はまだ参加し、内側であり、それはnull/undefined項目であるかもしれないものを除外します。

どうすればいいですか? LinqJSの結合構文はどのように機能しますか?

+0

その内容が異なりますので、あなたは、両方のアレイに参加することはできません。あなたは最終的な新しい配列にそれらを変形することができます。 – MaxZoom

+0

Linqやバニラを使用する必要がありますか?jsもOKですか? – Vovan

+0

私はあなたがこのライブラリを意味すると思う:https://github.com/SvSchmidt/linqjs、私はgithubのreadmesの外観を好む;) – niceman

答えて

2

私はLinqJSについてはわかりませんが、通常のJSはこれ以上のことができます。

これにはいくつかの方法があります。 reduce()map()、およびsort()の関数は非常にLinq風であり、ネイティブにうまく機能します。 (filter()と他の多くもあります)。

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

バニラJSが可能であることを示すのは良いことです(少なくとも1人は思っているほど悪くないかもしれません) – niceman

+0

Samさん、ありがとうございましたLinqJSの使い方を探しています。私はJSをこのようにかなり簡単に行うことができます(私はすでにこの問題のコードを作っています)。しかし、私はこの特定のライブラリでこのタスクを実行する方法を学ぶことにもっと興味があります。これは、「どのようにしてこの結果を得るのか」という質問と、「この具体的な枠組みでこの結果をどうすれば得られるのか」という質問のほうが少ない。それが意味をなさないならば。 –

+0

ええ、私は自分の答えを投稿した後、あなたのコメントを見ました。 – samanime

3

あなたはGroupJoin

キーとグループ結果の平等に基づいて2つのシーケンスの要素を相互に関連付けを使用することができます。デフォルトの等価比較子は、キーを比較するために使用されます。シーケンスが空の場合はLEFT OUTER JOINをし、指定した希望値をとDefaultIfEmpty

を使用するための

は、指定されたシーケンスまたはシングルトンコレクション内の指定した値の要素を返します。

(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>