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

JS and ExpressionEngine - Remove KV pairs by duplicate values only?

我们正在使用 ExpressionEngine 构建站点。我们是 运行 SQL 查询以收集特定成员组的所有成员 ID。之后,我们使用 EE 标签从每个会员 ID 的自定义会员字段中获取数据。

ID 和字段数据需要保持成对,因为我们将填充一个下拉列表,以便 ID 是值,字段数据是文本,所以我们目前将它们放入 JS 数组中key/value 对。调用如下:

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"}
];

None 这些 ID(键)将永远相同,但字段数据(值)可以。因此,我们希望保留第一个具有唯一值的 KV 对,但删除该值的所有后续重复项 - 尽管由于不同的 ID(密钥),它们不会是真的 "duplicate values"。

请记住,KV 对都是动态的,是否有任何可能的方法通过 JS 执行此操作,以便我们可以为清理后的数据创建一个新数组以传递给下拉列表?

我会这样做...

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;
};

您可以通过修改 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 的解析中发生冲突。