JavaScript管理具有重复属性名称

时间:2016-05-17 09:22:31

标签: javascript javascript-objects

我有一个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] = '';
        }
    };

5 个答案:

答案 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查找密钥是否存在。

<强>算法

  1. 函数将name,value和length作为参数。长度最初为0。

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

    • 如果它不存在,则使用参数(name + length,value,0)递归调用自身。这会将密钥添加到列表中。

    • 如果(name + length)键不存在,则增加长度并使用(名称,值,长度)调用该函数。这种情况继续下去。

  3. 如果密钥不存在,只需添加即可。

    &#13;
    &#13;
    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;
    &#13;
    &#13;

相关问题