2015-02-23 42 views
0

我們正在用ExpressionEngine構建一個網站。我們正在運行SQL查詢來收集特定成員組的所有成員標識。之後,我們使用EE標籤從每個成員ID的自定義成員字段獲取數據。JS和ExpressionEngine - 僅按重複值刪除KV對?

ID和字段數據需要保持配對,因爲我們將填充下拉列表,因此ID是值,字段數據是文本,所以我們現在將它們作爲關鍵字放入JS數組中/值對。呼叫如下:

var array= [ 
{exp:query sql="SELECT * FROM exp_members WHERE group_id = 5"} 
    {exp:member:custom_profile_data 
     member_id="{member_id}"} 
     {if company != ''} 
      {{member_id}:"{company}"}, 
     {/if} 
    {/exp:member:custom_profile_data} 
{/exp:query} 
}; 

這給我們的輸出:

var array = [ 
    {1:"name01"}, 
    {2:"name02"}, 
    {3:"name01"}, 
    {4:"name03"} 
]; 

現在,我們的問題。我們需要基於重複字段的數據刪除對象(值)而已,所以上述陣列是這樣的:

var array = [ 
    {1:"name01"}, 
    {2:"name02"}, 
    {4:"name03"} 
]; 

這些ID的無(鍵)將永遠是相同的,但現場數據(值) 可。因此,我們希望保留第一個具有唯一值的KV對,但刪除該值的任何後續模糊 - 儘管由於不同的ID(鍵)它們不會是真正的「重複值」。

請記住,KV對都是動態的,是否有任何可能的方式通過JS來做到這一點,所以我們可以創建一個新的數組,以清理數據傳遞給下拉?

回答

0

您可以處理通過修改你的MySQL查詢重複。 (在我的例子,我的自定義字段ID爲1)

var myArray = []; 
{exp:query sql="SELECT MIN(m.member_id) AS co_member_id, d.m_field_id_1 AS company FROM exp_members m INNER JOIN exp_member_data d ON m.member_id = d.member_id WHERE d.m_field_id_1 != '' AND m.group_id > 0 GROUP BY d.m_field_id_1;"} 
    myArray.push({{co_member_id}: "{company}"}); 
{/exp:query} 

該查詢將使用第一(在序數意義上的)member_id實測值;您也可以將MIN更改爲MAX並獲取最後一個。

這會給你一個乾淨的輸出在你的來源,而不需要任何額外的JS處理。我還建議更改您輸出的變量的名稱,以免在EE的解析中發生衝突。

+0

非常優雅。我希望儘可能多地在查詢中保留這些內容。殺手工作。 mido22的答案非常適合JS的實現,但是這個解決方案在EE的範圍內絕對是首選。非常感謝。乾杯! – whatthefistheinternet 2015-03-03 15:55:01

0

我會不喜歡它......

function removeDups(arry){ 
    var tmp = {}, retainIdx=[], newArry=[]; 
    arry.forEach(function(obj, idx){ 
     var val = obj[Object.keys(obj)[0]]; 
     if(val && !tmp[val]){ 
      retainIdx.push(idx); 
      tmp[val] = true; 
     } 
    }); 
    retainIdx.forEach(function(i){ 
     newArry.push(arry[i]); 
    }); 

    return newArry; 
}; 
+0

完美!非常感謝你對此的幫助。 – whatthefistheinternet 2015-02-24 15:53:14