2016-12-31 2 views
0

У меня есть два массива объектов, и я хочу получить значение ключа на основе условия.Получить значение ключа на основе ключа другого объекта

Я хочу получить значения id из старого массива на основе ключа googleId от deltaArr.

Так что, когда googleId из deltaArr матчи с googleId из oldArr, я хочу, чтобы получить id из oldArr по этому индексу и хранить в массиве.

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" присутствует в обоих массивах. Я попытался выше, но его подачи undefined

Примечание: Длина обоих массивов варьироваться в зависимости от динамических данных. В этом случае, я бы не знал, что это значение id или googleId

+1

Ваша компания de содержит только один цикл. Вы сравниваете 'deltaArr [i]' и 'oldArr [i]', где 'i' - одна и та же переменная. Это приведет только к совпадению, которое встречается в одном и том же индексе в обоих массивах. – melpomene

+0

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

+0

@melpomene Именно эта проблема связана с тем, что длина обоих массивов различна. Как бы я зацикливал оба массива? Должен ли я использовать вложенный цикл? или 'array.find()'? – Satyadev

ответ

3

Вы можете использовать хэш-таблицу для googleId и проверить old массив, если известный googleId найден, затем добавьте id в массив результатов.

Хэш-таблица - это объект с 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

В некоторых случаях может быть больше/меньше объектов в одном или другом массиве – 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 *, а это значит, что вы можете получить доступ к этим элементам напрямую, как только у вас есть ключ. Один из способов сделать это - создать «карту», ​​но он также работает с парами/ключами простого значения объекта. Фактически, вы можете просто заменить слово * hash * на * key * (или * index *) в моем ответе. – trincot

Смежные вопросы