2015-02-23 17 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