当条件和字段名相同时,如何不允许在items数组中出现重复项?
How don't allow duplicates in the items array when condition and field name are the same?
我有这段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_field
和data_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_field
和data_condition
是相同的,即使它们共享相同的值,只有一个是不同的。正确的输出应该是:
Object {["asset_locations_name","=",["1212341047","1212341048","1212369641", "1212369653"]]: 1}
其中data_values
用新值更新,data_field
和data_condition
保持唯一。
在这种情况下第二次+执行的条件是:
- 如果
data_field
和data_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;
}
更新小提琴
- 如何在映射数组中添加换行符
- javascript结合了数组和字典
- 需要帮助设置json数组
- 不能从angular2中的子组件指定父组件中的数组
- 使用JS将数组转换为json对象
- 数组在递归方法中设置为null
- knockoutjs可观察数组
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 将数组从PHP传递到Javascript
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- 在函数中添加数组元素的数值
- 无法通过数组映射绑定
- javascript中的数组出错
- 如何使用 node.js 比较两个 json 数组
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 根据id将json数组组合为一个json数组
- 如何通过数组更新角度子范围
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 当条件和字段名相同时,如何不允许在items数组中出现重复项?
- Javascript:数组