JavaScript管理具有重复属性名称的对象属性
JavaScript manage object properties with duplicate property names
我有一个JavaScript对象:
var list = {
ListId: '',
Items: {}
};
我想做的是能够将动态属性添加到Items
属性对象中。用户可以定义具有相同名称的属性,但逻辑应检查该属性是否存在,如果存在,则通过添加后缀或前缀(生成)创建相同的属性名称,但用户仍将看到相同的属性名。
示例:
var list = {
ListId: '',
Items: {
Name :{
Value: 'Some Value',
DisplayName: "Name"
},
Name1 :{
Value: 'Some Other Value',
DisplayName: "Name"
},
Name2 :{
Value: 'Some Third Value',
DisplayName: "Name"
}
}
};
如何管理此对象属性?
我设法弄清楚了如果属性不存在,如何添加它们:
function addProperty(name) {
if (!list.Items.hasOwnProperty(name)) {
list.Items[name] = '';
}
};
首先,您的新属性是一个对象,而不是一个空白字符串,因此至少应该是
function addProperty(name) {
if (!list.Items.hasOwnProperty(name)) {
list.Items[name] = {};
}
};
此外,您已经拥有了所需的所有方法,只需创建一个else
零件并以数字形式递增name
,直到您找到一个不存在的方法:
function addProperty(name) {
if (!list.Items.hasOwnProperty(name)) {
list.Items[name] = {};
}
else{
var i = 1;
while(list.Items.hasOwnProperty(name + i)){
i++;
}
list.Items[name + i] = {};
}
};
您可以检查所需的名称是否是项属性的键。如果是true
,则可以使用它。
function checkIsFree(item) {
return !(item in list.Items);
}
var list = { ListId: '', Items: { Name: { Value: 'Some Value', DisplayName: "Name" }, Name1: { Value: 'Some Other Value', DisplayName: "Name" }, Name2: { Value: 'Some Third Value', DisplayName: "Name" } } };
document.write(checkIsFree('Name5') + '<br>'); // true
document.write(checkIsFree('Name2') + '<br>'); // false
试试这个:
var indexes = {};
function addProperty(name, value) {
if (!list.Items.hasOwnProperty(name)) {
list.Items[name] = value;
} else {
indexes[name] = indexes[name]+1 || 1;
list.Items[name + indexes[name]] = value;
}
};
以下代码应执行所需操作:
function addProperty(obj, name) {
if (!obj.Items.hasOwnProperty(name)) {
obj.Items[name] = '';
return true
}
return false
};
function addIndexedProperty(obj, name){
var i = 1;
var originName = name;
while (!addProperty(obj, name)){
name = originName + i;
i++;
}
return obj
}
var list = {
ListId: '',
Items: {}
};
addIndexedProperty(list, 'Name');
addIndexedProperty(list, 'Name');
addIndexedProperty(list, 'Name');
console.log(list['Items']); // Object {Name: "", Name1: "", Name2: ""}
祝你好运
使用递归添加后缀。使用hasOwnProperty
查找密钥是否存在。
算法
-
函数以名称、值和长度为参数。长度最初为0。
-
当提供的密钥已经存在时,它会增加长度并检查(名称+长度)密钥是否存在。
-
若它不存在,它会用参数(名称+长度,值,0)递归地调用自己。这将把密钥添加到列表中。
-
如果(name+length)键不存在,则长度将递增,并使用(name,value,length)调用函数。这种情况还在继续。
-
如果密钥不存在,只需添加即可。
var list = {
ListId: '',
Items: {
Name: {
Value: 'Some Value',
DisplayName: "Name"
},
Name1: {
Value: 'Some Other Value',
DisplayName: "Name"
},
Name2: {
Value: 'Some Third Value',
DisplayName: "Name"
}
}
};
function addProperty(name, value, length = 0) {
if (list.Items.hasOwnProperty(name)) {
length++;
if (list.Items.hasOwnProperty(name + length)) {
return addProperty(name, value, length);
} else {
return addProperty(name + length, value, 0);
}
} else {
return list.Items[name] = value;
}
};
addProperty('this_argument_does_not_exist_yet', 'val');
addProperty('Name', 'val');
addProperty('Name', 'val');
addProperty('Name', 'val');
addProperty('Name1', 'val');
console.log(list);
document.getElementById('mypre').innerHTML = JSON.stringify(list,null,2);
<pre id="mypre"></pre>
相关文章:
- 为什么我可以在Array属性对象中找到Javascript Array for Each方法
- 使用onclick调用属性对象函数
- 嵌套为..in 循环,列出多维对象的属性(对象)
- 动态属性对象 - JSON
- 在不使用隔离范围angularjs自定义指令的情况下获取属性对象
- 通过属性传递属性/对象.Javascript
- Javascript:属性/对象的类型
- 访问JSON中的属性(对象)
- 属性对象Javascript不是用Jquery Deferred设置的
- 无法读取属性'#<对象>'未定义的获取错误
- Twitter中多属性对象的子字符串匹配
- 无法设置'data'属性'对象'标记.(只IE8)
- 更新数据属性对象属性值
- 将属性对象的选定对象从原型推入数组
- 将单个属性对象字面量的数组转换为仅包含其值的数组的最佳方法
- 寻找一种更简单的方法来检查是否多个属性&对象中的方法是未定义的
- 主干模型:带有get方法的空属性,但在属性对象中
- 如何赋值给"text"someText"属性对象在动能js
- Angularjs的数据绑定与数据属性对象
- 如何将一个嵌套的javascript对象转换为只有一级属性对象