我有一个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] = '';
}
};
答案 0 :(得分:1)
首先,你的新属性是一个对象,而不是一个空白字符串,所以至少应该是
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] = {};
}
};
答案 1 :(得分:0)
您可以检查所需名称是否为商品属性的键。如果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
答案 2 :(得分:0)
试试这个:
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;
}
};
答案 3 :(得分:0)
以下代码应执行所需的操作:
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: ""}
祝你好运!
答案 4 :(得分:0)
使用递归添加后缀。使用hasOwnProperty
查找密钥是否存在。
<强>算法强>
函数将name,value和length作为参数。长度最初为0。
当提供的密钥已存在时,它会增加长度并检查(名称+长度)密钥是否存在。
如果它不存在,则使用参数(name + length,value,0)递归调用自身。这会将密钥添加到列表中。
如果(name + 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);
&#13;
<pre id="mypre"></pre>
&#13;