2016-12-31 16 views
0

私はオブジェクトの2つの配列を持っており、条件に基づいてキーの値を取得したい。別のオブジェクトのキーに基づいてキーの値を取得

deltaArrのキーgoogleIdに基づいて、古い配列の値をidにしたいと考えています。 oldArrのgoogleIdと

だから、ときgoogleId deltaArrの試合、私は、アレイ内のそのインデックスと店でoldArrのidを取得したいです。

function getPrimaryKeys(deltaArr, oldArr){ 
    console.log('deltaArr........ ', JSON.stringify(deltaArr, null, 2)); 
    console.log('oldArr........ ', JSON.stringify(oldArr, null, 2)); 
    var primaryKeys = []; 
    for(var i = 0; i< deltaArr.length; i++){ 
     if(deltaArr[i].hasOwnProperty('googleId') && deltaArr[i].googleId == oldArr[i].googleId){ 
      primaryKeys.push(oldArr[i].id); 
     } 
    } 
    return primaryKeys; 
} 

deltaArr:

[ 
    { 
     "contact": { 
      "address": { 
      "home": "", 
      "office": "" 
      }, 
      "email": { 
      "home": "", 
      "other": "", 
      "work": "" 
      }, 
      "im": { 
      "aim": "", 
      "icq": "", 
      "skype": "" 
      }, 
      "phone": { 
      "cell": "+91-1234-567-891", 
      "home": "", 
      "work": "", 
      "e164": "+911234567891" 
      } 
     }, 
     "googleId": "2bf235bd8a846814", 
     "createdDate": "2016-12-31T13:03:09.203Z", 
     "name": "Test1", 
     "profileData": "" 
    } 
] 

oldArr:

[ 
    { 
    "contact": { 
     "address": { 
     "home": "", 
     "office": "" 
     }, 
     "email": { 
     "home": "", 
     "other": "", 
     "work": "" 
     }, 
     "im": { 
     "aim": "", 
     "icq": "", 
     "skype": "" 
     }, 
     "phone": { 
     "cell": "+91-1234-567-896", 
     "e164": "+911234567896", 
     "home": "", 
     "work": "" 
     } 
    }, 
    "createdDate": "2016-12-31T12:59:08.959Z", 
    "googleId": "3e98af288ff825f7", 
    "id": "2e4009de-4bce-4f02-b33c-415ad688f1c2", 
    "name": "Test6", 
    "profileData": "" 
    }, 
    { 
    "contact": { 
     "address": { 
     "home": "", 
     "office": "" 
     }, 
     "email": { 
     "home": "", 
     "other": "", 
     "work": "" 
     }, 
     "im": { 
     "aim": "", 
     "icq": "", 
     "skype": "" 
     }, 
     "phone": { 
     "cell": "+91-1234-567-890", 
     "e164": "+911234567890", 
     "home": "", 
     "work": "" 
     } 
    }, 
    "createdDate": "2016-12-31T12:59:08.952Z", 
    "googleId": "2bf235bd8a846814", 
    "id": "411b2507-64a1-46d6-812b-8216446676e3", 
    "name": "Test0", 
    "profileData": "" 
    }, 
    { 
    "contact": { 
     "address": { 
     "home": "", 
     "office": "" 
     }, 
     "email": { 
     "home": "", 
     "other": "", 
     "work": "" 
     }, 
     "im": { 
     "aim": "", 
     "icq": "", 
     "skype": "" 
     }, 
     "phone": { 
     "cell": "+91-1234-567-895", 
     "e164": "+911234567895", 
     "home": "", 
     "work": "" 
     } 
    }, 
    "createdDate": "2016-12-31T12:59:08.951Z", 
    "googleId": "20735d9e8df44423", 
    "id": "46f579cb-dbda-49f1-8eb6-df621692e023", 
    "name": "Test5", 
    "profileData": "" 
    } 
] 

あなたは"googleId": "2bf235bd8a846814"が表示された場合の配列の両方に存在します。 Iは、上記を試したが、そのはundefined

注与える:両方の配列の長さは、動的データに基づいて変化します。この場合、私はあなたが知らgoogleIdが発見された場合、結果の配列にidを追加googleIdのハッシュテーブルを使用してold配列を確認することができidまたはgoogleId

+1

deは1つのループしか含みません。 'deltaArr [i]'と 'oldArr [i]'を比較します。ここで 'i'は同じ変数です。これにより、両方の配列の同じインデックスで発生する一致のみが検索されます。 – melpomene

+0

http://stackoverflow.com/questions/11922383/access-process-nested-objects-arrays-or-json – Teemu

+0

@melpomene正確には、両方の配列の長さが異なるため、問題です。両方の配列をどのようにループするのですか? Nested forループを使用する必要がありますか?または 'array.find()'? – Satyadev

答えて

3

の値が何であるかを知ることはできません。

ハッシュテーブルは、googleIdをキーとし、trueを値とするオブジェクトです。

{ 
    "2bf235bd8a846814": true 
} 

これはold配列のチェックに必要です。ハッシュが'2bf235bd8a846814'の場合、ハッシュテーブルはtrueを返し、それ以外の場合はundefiedを返します。これはif条件の偽値です。

function getId(delta, old) { 
 
    var googleId = Object.create(null), 
 
     result = []; 
 

 
    delta.forEach(function (a) { 
 
     googleId[a.googleId] = true; 
 
    }); 
 
    console.log(googleId); 
 
    old.forEach(function(a) { 
 
     if (googleId[a.googleId]) { 
 
      result.push(a.id); 
 
     } 
 
    }); 
 
    return result; 
 
} 
 

 
var deltaArray = [{ "contact": { "address": { "home": "", "office": "" }, "email": { "home": "", "other": "", "work": "" }, "im": { "aim": "", "icq": "", "skype": "" }, "phone": { "cell": "+91-1234-567-891", "home": "", "work": "", "e164": "+911234567891" } }, "googleId": "2bf235bd8a846814", "createdDate": "2016-12-31T13:03:09.203Z", "name": "Test1", "profileData": "" }], 
 
    oldArray = [{ "contact": { "address": { "home": "", "office": "" }, "email": { "home": "", "other": "", "work": "" }, "im": { "aim": "", "icq": "", "skype": "" }, "phone": { "cell": "+91-1234-567-896", "e164": "+911234567896", "home": "", "work": "" } }, "createdDate": "2016-12-31T12:59:08.959Z", "googleId": "3e98af288ff825f7", "id": "2e4009de-4bce-4f02-b33c-415ad688f1c2", "name": "Test6", "profileData": "" }, { "contact": { "address": { "home": "", "office": "" }, "email": { "home": "", "other": "", "work": "" }, "im": { "aim": "", "icq": "", "skype": "" }, "phone": { "cell": "+91-1234-567-890", "e164": "+911234567890", "home": "", "work": "" } }, "createdDate": "2016-12-31T12:59:08.952Z", "googleId": "2bf235bd8a846814", "id": "411b2507-64a1-46d6-812b-8216446676e3", "name": "Test0", "profileData": "" }, { "contact": { "address": { "home": "", "office": "" }, "email": { "home": "", "other": "", "work": "" }, "im": { "aim": "", "icq": "", "skype": "" }, "phone": { "cell": "+91-1234-567-895", "e164": "+911234567895", "home": "", "work": "" } }, "createdDate": "2016-12-31T12:59:08.951Z", "googleId": "20735d9e8df44423", "id": "46f579cb-dbda-49f1-8eb6-df621692e023", "name": "Test5", "profileData": "" }]; 
 

 
console.log(getId(deltaArray, oldArray));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

ちょうど今質問を更新しました。両方の配列の長さは固定されていません – Satyadev

+0

複数のオブジェクトが1つまたは他の配列に存在することがあります。 – Satyadev

+0

@Satyadev、複数の 'googleId'のハッシュが追加されました。 –

2

あなたはそので古い配列をハッシュ可能性(地図を使って)値をgoogle_id、およびデルタ配列の.map()呼び出しのためのコンテキストとしてそのを養う:

function collect(delta, old) { 
 
    return delta.map(function (d) { 
 
     return this.get(d.googleId).id 
 
    }, new Map(old.map (o => [o.googleId, o]))); 
 
} 
 

 
var deltaArr = [{ "contact": { "address": { "home": "", "office": "" }, "email": { "home": "", "other": "", "work": "" }, "im": { "aim": "", "icq": "", "skype": "" }, "phone": { "cell": "+91-1234-567-891", "home": "", "work": "", "e164": "+911234567891" } }, "googleId": "2bf235bd8a846814", "createdDate": "2016-12-31T13:03:09.203Z", "name": "Test1", "profileData": "" }]; 
 
var oldArr = [{ "contact": { "address": { "home": "", "office": "" }, "email": { "home": "", "other": "", "work": "" }, "im": { "aim": "", "icq": "", "skype": "" }, "phone": { "cell": "+91-1234-567-896", "e164": "+911234567896", "home": "", "work": "" } }, "createdDate": "2016-12-31T12:59:08.959Z", "googleId": "3e98af288ff825f7", "id": "2e4009de-4bce-4f02-b33c-415ad688f1c2", "name": "Test6", "profileData": "" }, { "contact": { "address": { "home": "", "office": "" }, "email": { "home": "", "other": "", "work": "" }, "im": { "aim": "", "icq": "", "skype": "" }, "phone": { "cell": "+91-1234-567-890", "e164": "+911234567890", "home": "", "work": "" } }, "createdDate": "2016-12-31T12:59:08.952Z", "googleId": "2bf235bd8a846814", "id": "411b2507-64a1-46d6-812b-8216446676e3", "name": "Test0", "profileData": "" }, { "contact": { "address": { "home": "", "office": "" }, "email": { "home": "", "other": "", "work": "" }, "im": { "aim": "", "icq": "", "skype": "" }, "phone": { "cell": "+91-1234-567-895", "e164": "+911234567895", "home": "", "work": "" } }, "createdDate": "2016-12-31T12:59:08.951Z", "googleId": "20735d9e8df44423", "id": "46f579cb-dbda-49f1-8eb6-df621692e023", "name": "Test5", "profileData": "" }]; 
 

 
console.log(collect(deltaArr, oldArr));

+0

ハッシング・サーズとは何ですか?私は理解していないのが残念です。私はまだ学習しています – Satyadev

+1

私はここでハッシングという言葉を使っていますが、古いアレー要素を* googleId *値で*キー*することができます。これを行う方法の1つは、 'Map'を作成することですが、プレーンなオブジェクトのキーと値のペアでも動作します。実際には、私の答えで* hash *を* key *(または* index *)という単語に置き換えることができます。 – trincot

関連する問題