【问题标题】:javascript update or add values to arrayjavascript更新或向数组添加值
【发布时间】:2017-09-16 14:39:32
【问题描述】:

我想向数组添加值。但相同的值可能会更新。例如我的数组是

[{"abc1":"123456"},{"abc2":"123456"}]

何时再次添加是 abc1。它可能会更新。例如在正常情况下

[{"abc1":"123456"},{"abc2":"123456"},{"abc1":"123456"}]

但我想要

[{"abc2":"123456"},{"abc1":"123456"}]

我的代码

var categories = [],
arrIndex = {};

addOrReplace({"abc1":"125"});
addOrReplace({"abc2":"126"});
addOrReplace({"abc1":"127"});
addOrReplace({"abc3":"129"});


function addOrReplace(object) {
    var index = arrIndex[object[0]];
    console.log("index:"+object[0]);
    if(index === undefined) {
        index = categories.length;
    }
    arrIndex[object[1]] = index;
    categories[index] = object;
}

console.log(categories);

它没有显示正确的答案。 它显示

[{"abc3":"129"}]

我想要

[{"abc2":"126"},{"abc1":"127"},{"abc3":"129"}]

这怎么可能?请帮帮我?

【问题讨论】:

  • 所以如果我理解正确,如果存在带有键 abc1 的对象,请将其删除并推送新值。我说的对吗?
  • 如果数组中的对象只有一个键,我建议对象多于数组。值将在 Object 中被覆盖
  • @Rajesh 是的,你是对的。
  • @Rayon 怎么可能?
  • @joe — var obj = { a: 1, b: 2 }; obj.a = 3; console.log(JSON.stringify(obj));

标签: javascript html arrays node.js


【解决方案1】:

如果找到索引,您可以使用Array#findIndex 并从类别中拼接对象,然后将新对象推送到categories

function addOrReplace(object) {
    var key = Object.keys(object)[0],
        index = categories.findIndex(o => key in o);

    if (index !== -1) {
        categories.splice(index, 1);
    }
    categories.push(object)
}

var categories = [];

addOrReplace({ abc1: "125"});
console.log(categories);
addOrReplace({ abc2: "126"});
console.log(categories);
addOrReplace({ abc1: "127"});
console.log(categories);
addOrReplace({ abc3: "129"});
console.log(categories);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:
       var categories = new Map(); 
    
        addOrReplace({"abc1":"125"});
        addOrReplace({"abc2":"126"});
        addOrReplace({"abc1":"127"});
        addOrReplace({"abc3":"129"});
    
    
        function addOrReplace(object) {
           for (var name in object)
                 categories[name] = object;
        }
    
        console.log(categories);
    

    【讨论】:

      【解决方案3】:
      var categories = [],
      arrIndex = {};
      
      addOrReplace({"abc1":"125"});
      addOrReplace({"abc2":"126"});
      addOrReplace({"abc1":"127"});
      addOrReplace({"abc3":"129"});
      
      
      function addOrReplace(object) {
          for(var c in categories){
              if(Object.keys(categories[c])[0] == Object.keys(object)[0]){
                  categories.splice(c,1)
              }
          }
          categories.push(object)
      }
      
      console.log(categories);
      //[{"abc2":"126"},{"abc1":"127"},{"abc3":"129"}]
      

      【讨论】:

        【解决方案4】:

        我不知道您最终将如何使用最终数据,但如果您正在寻找唯一性,我建议您使用 object hash 而不是数组。

        最初:

        {
            "abc1" : "123456",
            "abc2" : "123456"
        }
        

        如果您现在添加{ "abc1" : "some_other_value" }

        {
            "abc1" : "some_other_value",
            "abc2" : "123456"
        }
        

        您还可以使用if(objectHash('abc1')) 检查该值是否已存在。

        它可以让你免于额外的遍历,如果已经存在,它会覆盖值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-23
          • 2021-03-24
          • 1970-01-01
          • 2019-09-14
          • 2011-01-01
          • 2023-02-22
          • 1970-01-01
          • 2017-01-06
          相关资源
          最近更新 更多