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)
}