JS和ExpressionEngine - 仅按重复值删除KV对?

时间:2015-02-23 03:11:17

标签: javascript arrays expressionengine key-value

我们正在使用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做到这一点,所以我们可以为清理后的数据创建一个新的数组传递给下拉列表?

2 个答案:

答案 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的解析中不发生冲突。