【问题标题】:How to change the value of an Array object in Javascript如何在 Javascript 中更改 Array 对象的值
【发布时间】:2018-01-16 08:30:19
【问题描述】:

我有一个数组对象调用 listOfObjects。

[{"name":"A", "data":"[{"value1":"1","value2":"2"}]"},
 {"name":"B", "data":"[{"value1":"1","value2":"2"}]"}]

我想要做的是将一个对象插入到数组为空的数组中。如果数组不为空,则检查里面的项目。如果项目已经存在,请更新项目,否则将其添加到数组中。下面是我的代码

  var searchName= "A"; 
  if (listOfObjects.length > 0) {
            for (var i = 0; i < listOfObjects.length; i++) {
                if (listOfObjects[i].name == searchName) {
                    listOfObjects[i].data = data;
                    break;
                } else {
                    insert = {
                        'name': searchName,
                        'data': data
                    };
                    listOfObjects.push(insert);
                }
            }
    } else {
        insert = {
            'name': searchName,
            'data': data
        };
        listOfObjects.push(insert);
   }

当我运行它时,即使 A 已经存在,它也会更新现有项目,但还会在 listOfObjects 中再添加一次。反正有没有可以实现我想要的?谢谢..

【问题讨论】:

  • 您已将内部数组包装在 "" 中,这意味着它是字符串而不是数组

标签: javascript arrays arrayobject


【解决方案1】:

问题是您要插入数组inside for 循环以寻找匹配项。相反,请记住您是否看过匹配项,如果没有,请在循环之后插入。 length 检查也没有理由,也没有理由重复插入的逻辑:

var searchName= "A"; 
var found = false;
for (var i = 0; !found && i < listOfObjects.length; i++) {
    if (listOfObjects[i].name == searchName) {
        listOfObjects[i].data = data;
        found = true;
    }
}
if (!found) {
    listOfObjects.push({
        'name': searchName,
        'data': data
    });
}

请注意,如果您愿意,可以使用Array#find(可以为旧浏览器填充)来查找条目,而不是使用for 循环:

var searchName= "A"; 
var entry = listOfObjects.find(function(entry) {
    return entry.name == searchName;
});
if (entry) {
    entry.data = data;
} else {
    listOfObjects.push({
        'name': searchName,
        'data': data
    });
}

【讨论】:

    【解决方案2】:

    首先改变这个

    [{"name":"A", "data":"[{"value1":"1","value2":"2"}]"},
     {"name":"B", "data":"[{"value1":"1","value2":"2"}]"}]
    

    [{"name":"A", "data":[{"value1":1,"value2":2}]},
     {"name":"B", "data":[{"value1":"1","value2":"2"}]}];
    

    因为你的名单会throw Uncaught SyntaxError: Unexpected identifier

    【讨论】:

      【解决方案3】:

      编写另一个简单的函数来获取带有选定搜索名称的项目 listOfObjects[i]。这里的“getSearchObject()”函数检查 searchName 的存在,然后添加或更新数组。

      addOrRemoveItem() {
          let listOfObjects = [
            { "name": "A", "data": "[{'value1':'1','value2':'2'}]" },
            { "name": "B", "data": "[{'value1':'1','value2':'2'}]" }
          ],
            data = '[{"value1":"1","value2":"2"}]';
          var searchName = "C";
          if (listOfObjects.length > 0) {
            let searchObj = this.getSearchObject(listOfObjects, searchName);
            if (searchObj) {
              searchObj.data = data;
            } else {
              let insert = {
                "name": searchName,
                "data": data
              }
              listOfObjects.push(insert);
            }
          } else {
            let insert = {
              "name": searchName,
              "data": data
            }
            listOfObjects.push(insert);
          }
        }
      
        getSearchObject(objArr, searchKey) {
          var obj = null;
          for (let i = 0; i < objArr.length; i++) {
            if (objArr[i].name === searchKey) {
              obj = objArr[i];
            }
          }
          return obj;
        }
      

      【讨论】:

        【解决方案4】:

        一个通用的解决方案,可以识别较旧的 JS 引擎(filter 而不是 find),但始终假设可以通过这样的方式实现唯一项目列表...

        function updateList(itemList, item) { // - always assume a list of unique items.
          var
            itemName = item.name,
            listItem = itemList.filter(function (elm) { // - assume `filter`, not find`.
              return (elm.name === itemName); // - find/get existing list  item by name.
            })[0];
        
          if (listItem) {
            listItem.data = item.data;
          } else {
            itemList.push(item)
          }
        }
        
        
        var list = [
          { "name": "A", "data": [ { "value1": "A1", "value2": "A2" }] },
          { "name": "B", "data": [ { "value1": "B1", "value2": "B2" }] },
          { "name": "C", "data": [ { "value1": "C1", "value2": "C2" }] }
        ];
        
        console.log('list : ', list);
        
        
        updateList(list,  { "name": "D", "data": [ { "value1": "D1", "value2": "D2" }] });
        
        updateList(list,  { "name": "B", "data": [ { "value1": "b_1", "value2": "b_2", "value3": "b_3" }] });
        updateList(list,  { "name": "C", "data": [ { "value3": "C3" }] });
        
        console.log('list : ', list);
        .as-console-wrapper { max-height: 100%!important; top: 0; }

        【讨论】:

          猜你喜欢
          • 2020-06-01
          • 1970-01-01
          • 2021-05-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-17
          • 2019-01-25
          • 2018-10-18
          相关资源
          最近更新 更多