2016-07-12 20 views
0

我推一些數據到陣列一個foreach環內:推送數據(嵌套)陣列,這取決於存在的對象字段

let result = []; 
data.forEach(function(part){ 
    let text = part.one + part.two; 
    result.push({ 
     text: text, 
     element: [{ id: part._id, page: part.page }] 
    }); 
}); 

但我需要檢查是否text已經在任何對象的陣列。

如果有這樣一個對象,那麼只有頁面part.page應該被添加到這個對象的數組中並且具有相同的文本字段。否則,數據應該只添加到結果數組中。

result = [ 
    { 
     text: 'Some text', 
     element: [{ id: 1, page: '12-34'}] 
    } 
] 

如果下一個part -elements應該是這樣的:

{ id: 2, one: 'Some ', two: 'text', page: '45-67' } 
{ id: 3, one: 'Another ', two: 'text', page: '12-34' } 

result應該得到

result = [ 
    { 
     text: 'Some text', 
     pages: [{ id: 1, page: '12-34'}, { id: 2, page: '45-67' }] // page added to the array, as text is identical 
    }, 
    { 
     text: 'Another text', 
     pages: [{ id: 3, page: '12-34'}] 
    } 
] 

其他問題

是否有可能通過text-field對結果數組排序第一,然後通過page -field對第二個元素對象排序?

這將是第一個對象錯誤的順序:

[{ id: 2, page: '45-67'}, { id: 1, page: '12-34' }] 

...和「一個諾特爾文本」應該是「小號 OME文本」之前

回答

1

您可以使用find來檢查元素是否存在。在你的情況我會使用findIndex用於更新嵌套的數組:

let index = result.findIndex(x => x.reference === reference); 

if (index === -1) { 
    result.push({ 
     text: text, 
     element: [ 
      { 
       id: part._id, 
       page: part.page 
      } 
     ] 
    }); 
} 
else { 
    result[index].element.push(
     { 
      id: part._id, 
      page: part.page 
     } 
    ); 
} 
-2

可以使用像這樣的查找對象:

result = []; 
lut = {}; 
data.forEach(function(part){ 
    text = part.one + part.two; 
    if (lut[text]){ 
     lut[text].element.push({ id: part._id, page: part.page }); 
    }else{ 
     lut[text]={ 
      text: text, 
      element: [{ id: part._id, page: part.page }] 
     } 
     result.push(lut[text]); 
    } 
}); 

當你完成對所有元素使用排序功能時,它需要一個比較函數作爲參數,您可以指定要用於排序的內容

+0

什麼'result.filter(X => x.text ===文本)',而不是一個新的對象? – user3848987

+0

當你有一個非常大的數組,並且需要爲每個新條目遍歷整個事物時,它會變得非常緩慢。使用對象作爲查找速度要快得多,因爲它不必掃描整個數組,而是使用智能查找機制 –