Javascript 如何检查特定对象键并更新(如果存在)

Javascript 如何检查特定对象键并更新(如果存在),javascript,jquery,Javascript,Jquery,我有向模型写入的文本输入。我希望这些对象写入模型并在密钥存在时更新 例如:如果我提交 Id: "1", Value: "Foo" 我用一个新值更新它: Id: "1", Value: "Bar" 我的数组应为: 0 { Id: "1", Value: "Bar"} 不是 示例如下: 我终于改变了很多… 我使用了一个标志来知道更新是否完成 因此,我首先运行.each()循环。如果已经没有密钥/对,则不会运行。然后,如果更改尚未完成,则进行比较,以推送一个新值 var obj={ 成对:[

我有向模型写入的文本输入。我希望这些对象写入模型并在密钥存在时更新

例如:如果我提交

Id: "1", Value: "Foo"
我用一个新值更新它:

Id: "1", Value: "Bar"
我的数组应为:

 0 { Id: "1", Value: "Bar"}
不是

示例如下:


我终于改变了很多…
我使用了一个标志来知道更新是否完成

因此,我首先运行
.each()
循环。如果已经没有密钥/对,则不会运行。然后,如果更改尚未完成,则进行比较,以推送一个新值

var obj={
成对:[]
}
$(“按钮”)。在(“单击”,函数(){
var keyValuePairs={
id:“”,
值:“”
}
var change_done=错误;
var input_id=$(this.prev().prop('id');
var dynamic_value=$(this.prev().prop('value');
$.each(对象对,函数(i,对){
如果(obj.pairs[i].id==input_id){//Change在这里。
对象对[i].id=input\u id;
对象对[i].值=动态值;
更改_done=true;
返回false;
}
});
如果(!change_done | | obj.pairs.length==0){
对象对推(keyValuePairs);
}
keyValuePairs.id=输入\u id;
keyValuePairs.value=动态值;
控制台日志(obj);
});

按钮1

按钮2
按钮3
试试这个

find()方法对数组中的每个元素执行一次函数:

  • 如果它找到一个数组元素,其中函数返回一个真值,则find()将返回该数组元素的值(并且不检查其余值)
  • 否则返回未定义的
  • find()的性能优于each()

    我们不需要将splice()与push()一起更新,因为find()之后我们有到对象的链接,所以我们可以更改值


    如果find()返回undefined,我们将把新对象推送到数组中

    我已经重写了一点。如果ID存在,将更新其值,并且不会插入新行:

    $(document).ready(function() {
        var obj = {
          pairs: []
        }
    
        $("button").on("click", function() {
        var input_id = $(this).prev().prop('id');
        var dynamic_value = $(this).prev().prop('value');
        var isUpdated = false;
        var keyValuePairs = {
            id: input_id,
            value: dynamic_value
        };
    
        if (obj.pairs.length == 0) {
            obj.pairs.push(keyValuePairs);
            return false;
        }
    
        $.each(obj.pairs, function(i, pair) {
            if (obj.pairs[i].id === input_id) {
                obj.pairs[i].value = dynamic_value;
                isUpdated = true;
                return false;
            }
        });
    
        if (!isUpdated) {
            obj.pairs.push(keyValuePairs);
        }
    
        console.log(obj);
      });
    });
    
    经过测试,效果良好。

    看看这是否有帮助

    $(文档).ready(函数(){
    var obj={
    成对:[]
    }
    $(“按钮”)。在(“单击”,函数(){
    var=false;
    var input_id=$(this.prev().prop('id');
    var dynamic_value=$(this.prev().prop('value');
    var keyValuePairs={
    id:input_id,
    值:动态值
    }
    如果(obj.pairs.length>0){
    $.each(对象对,函数(i,对){
    if(对[Object.keys(对)[0]==输入\u id){
    对象对[i]=键值对;
    发现=真;
    返回false;
    }
    });
    如果(!找到)
    对象对推(keyValuePairs);
    }否则{
    对象对推(keyValuePairs);
    }
    控制台日志(obj);
    });
    });
    
    
    按钮1
    
    按钮2
    按钮3

    您可以这样做:

    const pair = obj.pairs.find(pair => pair.id === input_id);
    
    if (pair) {
      obj.pairs[input_id] = {...keyValuePairs}
    } else {
      obj.pairs.push(keyValuePairs)
    }
    

    看起来您的方法从未被调用。将其包装在函数中,并在keyValuePairs初始化下面的“单击”时调用它。@Adam您指的是哪种方法?单击模型的按钮,每个输入都会写入模型。如果没有正确对齐{,将调用JS。我会从id=“1”中删除空格项目只是为了安全。我注意到,如果它是数组的第一个索引,它将更新。如果不是,它将复制id。虽然此代码片段可能会解决此问题,但有助于提高您的响应质量。请记住,您将在将来为读者回答此问题,而这些人可能不知道您的代码错误的原因estion。哇,不错。第一个元素有问题,但那是因为Chris的第一个元素插入不好。@GytisTenovimas什么是更好的第一个元素插入方法?@ChrisDavila抱歉,可能是一个措辞有点糟糕的句子。它不差,但看起来很奇怪。如果你看一看,第一个元素中还有一个额外的空格s ID:
    “1”
    。因此,此答案将作为不同的索引处理,从而创建两个ID为的元素#1@GytisTenovimas明白了,我修正了错误,谢谢你的帮助。
       var obj = {
            pairs: []
       }
    
    
        $("button").on("click", function() {
          var keyValuePairs = {
              id: "",
              value: ""
          }
    
          var input_id = $(this).prev().prop('id');
          var dynamic_value = $(this).prev().prop('value');
    
          if(obj.pairs.length > 0){
            $.each(obj.pairs, function(i, pair) {
              if($(this).id !== input_id){
                obj.pairs.push(keyValuePairs);
                return false;
              } else {
                obj.pairs.splice(i, 1);
                obj.pairs.push(keyValuePairs);
              }
            });
          } else {
              obj.pairs.push(keyValuePairs);
          }
    
          keyValuePairs.id = input_id;
          keyValuePairs.value = dynamic_value;
          console.log(obj);
    
       });
    
    $(document).ready(function() {
      var obj = {
        pairs: []
      }
    
      $("button").on("click", function() {
        var keyValuePairs = {
          id: "",
          value: ""
        }
    
        var input_id = $(this).prev().prop('id');
        var dynamic_value = $(this).prev().prop('value');
    
        var pair = obj.pairs.find(item => item.id === input_id)
        if(pair){
          pair.value = dynamic_value;
        } else {
          keyValuePairs.id = input_id;
          keyValuePairs.value = dynamic_value;
          obj.pairs.push(keyValuePairs);
        }
    
        console.log(obj);
    
      });
    
    
    });
    
    $(document).ready(function() {
        var obj = {
          pairs: []
        }
    
        $("button").on("click", function() {
        var input_id = $(this).prev().prop('id');
        var dynamic_value = $(this).prev().prop('value');
        var isUpdated = false;
        var keyValuePairs = {
            id: input_id,
            value: dynamic_value
        };
    
        if (obj.pairs.length == 0) {
            obj.pairs.push(keyValuePairs);
            return false;
        }
    
        $.each(obj.pairs, function(i, pair) {
            if (obj.pairs[i].id === input_id) {
                obj.pairs[i].value = dynamic_value;
                isUpdated = true;
                return false;
            }
        });
    
        if (!isUpdated) {
            obj.pairs.push(keyValuePairs);
        }
    
        console.log(obj);
      });
    });
    
    const pair = obj.pairs.find(pair => pair.id === input_id);
    
    if (pair) {
      obj.pairs[input_id] = {...keyValuePairs}
    } else {
      obj.pairs.push(keyValuePairs)
    }