当条件和字段名相同时,如何不允许在items数组中出现重复项?

How don't allow duplicates in the items array when condition and field name are the same?

本文关键字:数组 items 不允许 字段 条件      更新时间:2023-09-26

我有这段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>

我正在构建一个对象,如下所示:

$(function() {
  ...
  var list = {}; 
  var items = [];
  ...
  $('#add').click(function() {
    var data_field = $('#fields :selected').val();
    var data_condition = $('#conditions :selected').val();
    var data_values = $('#condition_value_1').val();
    var item = [
      data_field,
      data_condition,
      data_values
    ];
    var key = JSON.stringify(item);
    if (list[key] === 1) return; // skip
    list[key] = 1;
    items.push(item);
    console.log(list);
    console.log(items);
  });
});

它工作,但它允许重复的data_fielddata_condition意味着它们应该是唯一的,并更新它的data_values仅。例如,如果执行上面的代码并为给定条件添加一些值,则应该在控制台中以以下内容结束:

Object {["asset_locations_name","=",["1212341047","1212341048","1212369641"]]: 1}

现在,如果您第二次运行它并更改data_values,您将在控制台中以以下内容结束:

Object {["asset_locations_name","=",["1212341047","1212341048","1212369641"]]: 1, ["asset_locations_name","=",["1212341047","1212341048","1212369653"]]: 1}

正如你注意到的,data_fielddata_condition是相同的,即使它们共享相同的值,只有一个是不同的。正确的输出应该是:

Object {["asset_locations_name","=",["1212341047","1212341048","1212369641", "1212369653"]]: 1}

其中data_values用新值更新,data_fielddata_condition保持唯一。

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

  • 如果data_fielddata_condition保持不变,那么寻找它的值并正确地更新它们,而不允许重复。
  • 将是添加新条目的有效选项。

下面是上面的另一个例子:

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}

请注意,在2nd执行中,我如何保持相同的条目,但更新它的data_values,这是正确的和想要的行为。

注意在3rd执行中,我们如何改变data_condition的值,使其成为一个新条目,无论data_values是否相同。如果有任何错字,我不知道,或者你没有理解任何东西,让我知道,我会尽我最大的努力把这个弄清楚。

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

我把小提琴留在这里了。

我怎样才能做到这一点?任何帮助吗?

更新:如果键保持

当前的解决方案有一个问题,即当键被保留时,值不会累积。

这里有一个更新版本的Fiddle显示这个问题。

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

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]);
}
// ...

你更新的小提琴。如果您需要将此items对象转换为普通数组,我还包含了一个函数。

累加选定值

要累积为同一键选择的值,可以使用以下代码更新items[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]);
    }
}

这稍微改变了结构,因为现在只有data_values作为值存储,所以toArray函数需要从键中获取其余的值:

function toArray(items) {
  result = [];
  for (key in items) {
    // decode key, and concatenate the values array to it
    result.push(JSON.parse(key).concat([items[key]]));
  }
  return result;
}

更新小提琴

相关文章: