JavaScript管理具有重复属性名称的对象属性

JavaScript manage object properties with duplicate property names

本文关键字:属性 对象 管理 JavaScript      更新时间:2023-09-26

我有一个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查找密钥是否存在。

算法

  1. 函数以名称、值和长度为参数。长度最初为0。

  2. 当提供的密钥已经存在时,它会增加长度并检查(名称+长度)密钥是否存在。

    • 若它不存在,它会用参数(名称+长度,值,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>