簡體   English   中英

將數組與對象進行比較

[英]Comparing an array with an object

我正在嘗試構建一個簡單的統計工具,該工具可接收一堆CSV,將其解析為JSON,執行一些跨數據操作並輸出帶有格式化統計信息的新CSV。 我對JS很陌生,在嘗試在對象與數組之間進行數據交叉時遇到了麻煩。

解析后,我收到一個大對象(統計信息),格式如下:

{
  'operator_1':
    conversions:
     [
       { 
         id: '3f002ab58',
         date: 13/03/2016
       },

       { 
         id: '4d002fb18',
         date: 14/03/2016
       }
      ]
    'opertor_2':
    conversions:
     [
       { 
         id: '1e03021149',
         date: 21/03/2016
       },

       { 
         id: '4bbc102fb18',
         date: 11/03/2016
       }
      ]
}

我還有另一個看起來像這樣的數組(例如,countries_array []):

[
  {id : '4bbc102fb18', country : 'russia'},
  {id : '33f3897300a', country : 'australia'},
  {id : '4d002fb18', country : 'usa'}
]

我想做的是遍歷country_array [],在大對象(統計信息)中查找其ID的所有出現,然后將country屬性附加到正確的相應運算符的對象的轉換數組。 因此,在我執行attach_countries(stats,countries_array [])之后,我將收到如下所示的相同對象(或一個新對象,在這種情況下沒有關系):

{
  'operator_1':
    conversions:
     [
       { 
         id: '3f002ab58',
         date: 13/03/2016
       },

       { 
         id: '4d002fb18',
         date: 14/03/2016,
         country : 'usa' //usa was added
       }
      ]
    'opertor_2':
    conversions:
     [
       { 
         id: '1e03021149',
         date: 21/03/2016
       },

       { 
         id: '4bbc102fb18',
         date: 11/03/2016,
         country : 'russia' //russia was added
       }
      ]
}

您為對象提供的語法無效。 假設操作員屬性是具有conversions屬性的對象,則可以使用下面的ES6解決方案。 它首先構建一個哈希表,以避免您每次都需要遍歷各個國家,但是可以通過id直接訪問它們:

const hash = new Map(countries_array.map( item => [item.id, item.country] ));

Object.keys(stats).forEach(key => {
    stats[key].conversions.forEach(item => {
        if (hash.has(item.id)) item.country = hash.get(item.id);
    });
});

 var stats = { operator_1: { conversions: [ { id: '3f002ab58', date: '13/03/2016' }, { id: '4d002fb18', date: '14/03/2016' } ], }, operator_2: { conversions: [ { id: '1e03021149', date: '21/03/2016' }, { id: '4bbc102fb18', date: '11/03/2016' } ] } }; countries_array = [ {id : '4bbc102fb18', country : 'russia'}, {id : '33f3897300a', country : 'australia'}, {id : '4d002fb18', country : 'usa'} ]; const hash = new Map(countries_array.map( item => [item.id, item.country] )); Object.keys(stats).forEach(key => { stats[key].conversions.forEach(item => { if (hash.has(item.id)) item.country = hash.get(item.id); }); }); console.log(stats); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

修復了有錯誤的JSON代碼。 忽略您的“日期”格式。

 var stats = { 'operator_1': { conversions: [ { id: '3f002ab58', date: 13/03/2016 }, { id: '4d002fb18', date: 14/03/2016 } ] }, 'opertor_2': { conversions: [ { id: '1e03021149', date: 21/03/2016 }, { id: '4bbc102fb18', date: 11/03/2016 } ] } } var countries = [ {id : '4bbc102fb18', country : 'russia'}, {id : '33f3897300a', country : 'australia'}, {id : '4d002fb18', country : 'usa'} ] countries.map(country => { Object.keys(stats).map(operator => { let match = stats[operator].conversions.find(item => item.id === country.id) if (match) match.country = country.country }) }) console.log(stats) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM