我们正在使用ExpressionEngine构建网站。我们正在运行SQL查询来收集特定成员组的所有成员ID。之后,我们使用EE标签从每个成员ID的自定义成员字段中获取数据。
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 :(得分: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;
};
答案 1 :(得分: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的解析中不发生冲突。