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 的解析中发生冲突。
我们正在使用 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 的解析中发生冲突。