Javascript How don';当条件和字段名相同时,是否不允许项数组中存在重复项?

Javascript How don';当条件和字段名相同时,是否不允许项数组中存在重复项?,javascript,jquery,arrays,object,Javascript,Jquery,Arrays,Object,我有一段HTML代码: <select id="table" name="table"> <option></option> <option value="asset_locations">Asset Locations</option> <option value="companies">Company</option> </select> <select id="fields"

我有一段HTML代码:

<select id="table" name="table">
  <option></option>
  <option value="asset_locations">Asset Locations</option>
  <option value="companies">Company</option>
</select>
<select id="fields" name="fields">
  <option></option>
  <option value="asset_locations_id">asset_locations_id</option>
  <option value="companies_id">companies_id</option>
  <option value="region_id">region_id</option>
  <option value="asset_locations_name">asset_locations_name</option>
  ...
</select>
<select id="conditions">
  <option></option>
  <option value="=">Equal to</option>
  <option value="<>">Not Equal to</option>
  <option value=">">Greater Than (Strictly)</option>
  ...
</select>
<select id="condition_value_1" multiple="multiple" style="display: none">
  <option></option>
</select>
<button id="add" style="display: none">Add</button>
它可以工作,但允许重复
数据\u字段
数据\u条件
,这意味着它们应该是唯一的,并且只更新它的
数据\u值
。例如,如果执行上述代码并为给定条件添加一些值,则应在控制台以以下内容结束:

Object {["asset_locations_name","=",["1212341047","1212341048","1212369641"]]: 1}
Object {["asset_locations_name","=",["1212341047","1212341048","1212369641"]]: 1, ["asset_locations_name","=",["1212341047","1212341048","1212369653"]]: 1}
现在,如果您再次运行它并更改
数据\u值
,您将在控制台以以下内容结束:

Object {["asset_locations_name","=",["1212341047","1212341048","1212369641"]]: 1}
Object {["asset_locations_name","=",["1212341047","1212341048","1212369641"]]: 1, ["asset_locations_name","=",["1212341047","1212341048","1212369653"]]: 1}
正如您所注意到的,
data\u field
data\u condition
都是相同的,即使它们共享idem值,但只有一个是不同的。正确的输出应为:

Object {["asset_locations_name","=",["1212341047","1212341048","1212369641", "1212369653"]]: 1}
其中,
data\u值
用新值更新,并且
data\u字段
data\u条件
保持唯一

在这种情况下,第二次+执行的条件是:

  • 如果
    data\u字段
    data\u条件
    保持不变,则查找其值并正确更新,不允许重复
  • 除此之外,将是添加新条目的有效选项
下面是上面的另一个例子:

1st exec:
input: asset_locations_name, in, ["1212341047","1212341048","1212369641"]
output: Object {["asset_locations_name","=",["1212341047","1212341048","1212369641"]]: 1}

2nd exec:
input: asset_locations_name, in, ["1212341047","1212341048","1212369653"]
output: Object {["asset_locations_name","=",["1212341047","1212341048","1212369641", "1212369653"]]: 1}

3rd exec:
input: asset_locations_name, not in, ["1212341047","1212341048","1212369653"]
output: Object {["asset_locations_name","=",["1212341047","1212341048","1212369641"]]: 1, ["asset_locations_name","<>",["1212341047","1212341048","1212369653"]]: 1}
1st exec:
输入:资产位置名称,在,[“1212341047”、“1212341048”、“1212369641”]
输出:对象{[“资产名称”、“=”、[“1212341047”、“1212341048”、“1212369641”]]:1}
第二执行官:
输入:资产位置名称,在,[“1212341047”、“1212341048”、“1212369653”]
输出:对象{[“资产名称”、“=”、[“1212341047”、“1212341048”、“1212369641”、“1212369653”]:1}
第三执行官:
输入:资产位置名称,不在,[“1212341047”、“1212341048”、“1212369653”]
输出:对象{[“资产位置名称”、“=”、[“1212341047”、“1212341048”、“1212369641”]:1、[“资产位置名称”、“”、[“1212341047”、“1212341048”、“1212369653”]:1}
请注意,在
2nd
exec中,我如何保持相同的条目,但更新它的
data\u值
,这是正确的和需要的行为

请注意,在
3rd
exec中,我们如何更改
data\u条件的值
使其成为新条目,而不管
data\u值是否相同。如果有任何拼写错误,我不知道或者你什么都不懂,请让我知道,我会尽力弄清楚

注意:该解决方案应与旧浏览器兼容。(我们正在更新,但在此之前,我需要使用旧的浏览器兼容性)

我留下一把工作小提琴

我怎样才能做到这一点?有什么帮助吗

更新:如果保留键,则值不会累积

目前,解决方案存在一个问题,即当保留键时,值不会累积,并且应该保存


有一个小提琴的更新版本显示了这个问题。

这是使用ES6的理想情况。但当您要求向后兼容时,我建议:

var items = {};


//...
var key = JSON.stringify([data_field, data_condition]); // only these two!

items[key] = item; // will overwrite if same key

// if you need to have it as an array:
for (key in items) {
    console.log(items[key]);
}
// ...
您的帐户已更新。如果您需要将此
对象转换为普通数组,我还提供了一个函数

累积选定值 为了累积为同一个键选择的值,您可以使用此代码更新
项[key]

if (typeof data_values === 'string') {
    items[key] = data_values; // no accumulation for simple values
} else {
    items[key] = items[key] || [];
    // make values cumulative, while avoiding duplicates:
    for (var i = 0; i < data_values.length; i++) {
      if (items[key].indexOf(data_values[i]) == -1)
        items[key].push(data_values[i]);
    }
}

更新了与前几天相同的问题:-(这应该与较旧的浏览器兼容,很抱歉,请在您的问题中指定此要求。我将更新我的答案。已经更新了,请参阅底部的注释,如果您更新小提琴示例,以便我可以看到它在现场工作,那将非常好。如果我跟踪您,那么我可以取消此检查
if(list[key]==1)return;
对吗?确实如此,因为我知道您希望在重复提交的情况下更新以前的值。注意:我添加了一个更新的fiddle。