2016-04-06 21 views
2

以下の2つの配列を参照してください。まず、修復配列をバックエンドに送り、失敗した挿入を返すだけですが、実際にはより大きな失敗メッセージから配列を作成します基本的に次のようになります:複数のプロパティを持つ2つの配列をフィルタリングする

var sentRepairs = [ 
{id: 12345, car: 'Nissan', Model: 'Almera', RepairDate: new Date('2016-04-06'), Modificator: 'User200' }, 
{id: 12346, car: 'Nissan', Model: 'Almera', RepairDate: new Date('2016-04-07'), Modificator: 'User200' }, 
{id: 12347, car: 'Toyota', Model: 'Corolla', RepairDate: new Date('2016-04-09'), Modificator: 'User200' }, 
{id: 12348, car: 'Toyota', Model: 'Corolla', RepairDate: new Date('2016-04-10'), Modificator: 'User200' }, 
] 

これは、文字列である応答行から解析できるすべてのデータです。

var failedRepairs = [ 
{ car: 'Toyota', Model: 'Corolla', RepairDate: new Date('2016-04-09'), 
{ car: 'Nissan', Model: 'Almera', RepairDate: new Date('2016-04-07') 
]; 

この後、修理に失敗した車を含むサブアレイを作成する必要があります。同じモデルの修理がいくつかあることに注意してください。私が扱わなければならない識別子は車、モデル、日付です。バックエンドは、これを簡単にするだろうと私にIDを提供しません。

var resultsArrayShouldLookLikeThis = [ 
{id: 12346, car: 'Nissan', Model: 'Almera', RepairDate: new Date('2016-04-07'), Modificator: 'User200' }, 
{id: 12347, car: 'Toyota', Model: 'Corolla', RepairDate: new Date('2016-04-09'), Modificator: 'User200' } 
] 

私はこれがそう、ここでちょっとscummyリクエストに見えることをコメントでサポートされて実現したように、私はちょっと予想通りの結果として4つの未定義のオブジェクトを今のようもたらしたものです。ヘルパー関数は、配列内で一致する部分が見つかるとtrueを返し、そうでなければfalseを返します。

var result = sentRepairs.map(function (x) { 
    if (
    helperService.searchArrayByProperty(x.car, failedRepairs, "car") && 
    helperService.searchArrayByProperty(x.Model, failedRepairs, "Model")) { 
    return x; 
} 
}); 

ヘルパー関数自体、それは私が書いたと私はそれが実際の日付の間の比較を行いませんが、私はまだであっても、日付の比較なしで4つの未定義のオブジェクトを取得しています知っていない:

var searchArrayByProperty = function(value, array, property) { 
     var item = {}; 
     var found = false; 
     for (var i = 0; i < array.length; i++) { 
      if (typeof array[i][property] === "string") { 
       if (array[i][property].toString() === value) { 
        item = array[i]; 
        found = true; 
       } 
      } 
      else if (typeof array[i][property] === "number") { 
       if (array[i][property] === value) { 
        item = array[i]; 
        found = true; 
       } 
      } 
      else if (typeof array[i][property] === "boolean") { 
       if (array[i][property] === value) { 
        item = array[i]; 
        found = true; 
       } 
      } 
      else if (typeof array[i][property] === "undefined") { 
       return false; 
      } 
     } 

     if (found) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
+1

あなたがこれまでにしようとしているどのようなコード投稿することができますか? – JordanHendrix

+0

私たちはコード作成サービスではありません。私たちは、あなたがすでに試したコードが正しく動作していない理由を理解するのに役立つリソースです。それが機能するには、あなたが試したことを私たちに示す必要があります。 – jfriend00

+0

お待ちください、私はそれを知っています。私は数分で更新します。 – poptard

答えて

1

使用filterとループ:

resultsArrayShouldLookLikeThis = sentRepairs.filter(function(item){ 
    for(var i = 0; i < failedRepairs.length; i++){ 
     if(JSON.stringify(item.RepairDate) == JSON.stringify(failedRepairs[i].RepairDate)){ 
      return item; 
     } 
    } 
}); 

それはあなたのintial両方のアレイ間のuniqのキーだから、私は日付を比較しました。

EDIT:https://jsfiddle.net/u39nubpd/1/

私が追加したadditionnal条件

+0

これは私の脳が探していたものですが、私はそれを得ることができませんでした。彼らはまた問題を解決したので、私は他の答えも受け入れることができればいいと思うが、これは最も簡単だ。皆さん、ありがとうございました。 – poptard

+0

修理日のみフィルタリングします。 –

1

あなたがfailedRepairs throu反復処理し、検索のためのフィルタループで使用される一時的なオブジェクトを、構築することができます。複雑さO(n + m)。

var sentRepairs = [{ id: 12345, car: 'Nissan', Model: 'Almera', RepairDate: new Date('2016-04-06'), Modificator: 'User200' }, { id: 12346, car: 'Nissan', Model: 'Almera', RepairDate: new Date('2016-04-07'), Modificator: 'User200' }, { id: 12347, car: 'Toyota', Model: 'Corolla', RepairDate: new Date('2016-04-09'), Modificator: 'User200' }, { id: 12348, car: 'Toyota', Model: 'Corolla', RepairDate: new Date('2016-04-10'), Modificator: 'User200' }, ], 
 
    failedRepairs = [{ car: 'Toyota', Model: 'Corolla', RepairDate: new Date('2016-04-09') }, { car: 'Nissan', Model: 'Almera', RepairDate: new Date('2016-04-07') }], 
 
    filtered = function (base, faild) { 
 
     function key(o) { return [o.car, o.Model, o.RepairDate].join('|'); } 
 

 
     var object = {}; 
 

 
     faild.forEach(function (a) { 
 
      object[key(a)] = true; 
 
     }); 
 
     return base.filter(function (a) { 
 
      return object[key(a)]; 
 
     }); 
 
    }(sentRepairs, failedRepairs); 
 

 
document.write("<pre>" + JSON.stringify(filtered, 0, 4) + "</pre>");

+0

ちょっと、洗練されたソリューションのように思えますが、フィルタ機能を使って自分の状況をより効率的に使うことができました。私は間違いなくこの問題に取り組む新しい方法を学びました。あなたが手伝ってくれたおかげでありがたいことです。 – poptard

+0

それはフィルタメソッドを使用しています... –

+0

はい私は知っていますが、私は単にフィルタ関数を使ってfor-loopで失敗を繰り返すことを意味しました。 Durendalの答えのように。 – poptard

1

lodashは、このようなタスクのために作られたユーティリティです。ここ

var res = _.intersectionWith(sentRepairs,failedRepairs, function(sentItem, failedItem){ 
     if(sentItem.car == failedItem.car && sentItem.Model && JSON.stringify(sentItem.RepairDate) == JSON.stringify(failedItem.RepairDate)){ 
     return sentItem; 
    } 
}); 

console.log(res); 

fiddle

+0

ありがとう、私は確かにこの問題のためのツールがあったと確信していた。私はロダッシュを見ていきます。 – poptard

0

、私は違った質問を解釈している可能性が 私の解決策であるが、変数名は私の視点を理解するのに役立つと思います。

var initislRequestToBackend = [ 
{ id: 12345, car: 'Nissan', Model: 'Almera', RepairDate: new Date('2016-04-06'), Modificator: 'User200' }, 
{ id: 12346, car: 'Nissan', Model: 'Almera', RepairDate: new Date('2016-04-07'), Modificator: 'User200' }, 
{ id: 12347, car: 'Toyota', Model: 'Corolla', RepairDate: new Date('2016-04-09'), Modificator: 'User200' }, 
{ id: 12348, car: 'Toyota', Model: 'Corolla', RepairDate: new Date('2016-04-09'), Modificator: 'User200' }, 
{ id: 12348, car: 'Toyota', Model: 'Corolla', RepairDate: new Date('2016-04-10'), Modificator: 'User200' }]; 

//

var backendResponse = [{ car: 'Toyota', Model: 'Corolla', RepairDate: new Date('2016-04-09') }, 
{ car: 'Nissan', Model: 'Almera', RepairDate: new Date('2016-04-07') }]; 

//

var messageToShow = _.chain(backendResponse) 
.reduce(function(output, val) { 
    output.push(_.filter(initislRequestToBackend, val)); 
    return output; 
}, []) 
.flatten() 
.value(); 
console.log(messageToShow); 
関連する問題