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.
当提供的密钥已经存在时,它会增加长度并检查(名称+长度)密钥是否存在。
如果不存在,则递归调用自身,参数为(name+length,value,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>
我有一个 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.
当提供的密钥已经存在时,它会增加长度并检查(名称+长度)密钥是否存在。
如果不存在,则递归调用自身,参数为(name+length,value,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>