使用多个键/值对查找JSON对象,然后更新该对象的其他属性
Find JSON Object using multiple key/value pairs, then update that Object's other attribute
给定
sessionStorage.cart = "[
{"id":121,"name":"Pants","number":1,"specification":""},
{"id":121,"name":"Pants","number":2,"specification":""},
{"id":121,"name":"Pants","number":3,"specification":""}
]"
我想写一个函数,查找id为121,名称为Pants,编号为2的对象,以便我可以更新该对象的规范。因此,我将传递id、名称、数字和所需的新规格值,并得到如下输出:
sessionStorage.cart = "[
{"id":121,"name":"Pants","number":1,"specification":""},
{"id":121,"name":"Pants","number":2,"specification":"new value"},
{"id":121,"name":"Pants","number":3,"specification":""}
]"
我真的在努力思考这个问题…欢迎指导!
使用
var cart = [
{
"id": 121,
"name": "Pants",
"number": 1,
"specification": ""
},
{
"id": 121,
"name": "Pants",
"number": 2,
"specification": ""
},
{
"id": 121,
"name": "Pants",
"number": 3,
"specification": ""
}
];
cart.forEach(function(entry) {
if (entry.id == 121 && entry.name == 'Pants' && entry.number == 2) {
entry.specification = 'new value';
}
});
console.log(cart);
使用Array.prototype.find的简单解决方案
sessionStorage.cart.find(e =>
e.id === 121 &&
e.name === 'Pants' &&
e.number === 2
).specification = 'new value';
console.log(JSON.stringify(sessionStorage.cart, null, ' '));
输出[
{
"id": 121,
"name": "Pants",
"number": 1,
"specification": ""
},
{
"id": 121,
"name": "Pants",
"number": 2,
"specification": "new value"
},
{
"id": 121,
"name": "Pants",
"number": 3,
"specification": ""
}
]
您可能想要尝试下面的代码:
function update(oldValues, newValues, keyToCompare) {
var keyToCompareLen = keyToCompare.length;
var result = [];
oldValues.forEach(function(oldValue){
newValues.forEach(function(newValue){
var cnt = 0;
keyToCompare.forEach(function(key){
if(newValue[key] == oldValue[key]) {
++cnt;
}
});
if(cnt == keyToCompareLen) {
oldValue = $.extend(true, {}, oldValue, newValue);
}
});
result.push(oldValue);
});
return result;
}
var result = update([
{"id":121,"name":"Pants","number":1,"specification":""},
{"id":121,"name":"Pants","number":2,"specification":""},
{"id":121,"name":"Pants","number":3,"specification":""}
], [
{"id":121,"name":"Pants","number":2,"specification":"test"}
], [
"id",
"name",
"number"
]);
console.log(result);
注意:您需要包含jquery库。您也可以在这里运行代码https://fiddle.jshell.net/b17fx6qk/1/
遍历数组的效率很低。为了提高性能,您可以将所有索引值字符串化,并使用它们将对象存储在hashmap中,以便快速查找。比如:
function cartItem() {
this.id;
this.name;
this.number;
this.specification;
}
CartItem.hash = function(id, name, number) {
return [id, name, number].join('|');
};
cartItem.prototype.toHash = function() {
return CartItem.hash(this.id, this.name, this.number);
};
var cartMap = cart.reduce(function(map, item) {
var key = item.toHash();
map[key] = item;
}, { });
然后你可以(非常快速地)通过它的哈希值查找项目:
cartMap[CartItem.hash(id, name, number)];
试一下。只需匹配和更新
$(document).ready(function() {
var o = [];
o.id = 121;
o.name = "Pants";
o.number = 2;
updateVal(o);
});
function updateVal(o) {
var cart = [{
"id": 121,
"name": "Pants",
"number": 1,
"specification": ""
}, {
"id": 121,
"name": "Pants",
"number": 2,
"specification": ""
}, {
"id": 121,
"name": "Pants",
"number": 3,
"specification": ""
}];
$.each(cart, function(a, b) {
if (b.id == o.id && b.name == o.name && b.number == o.number) {
b.specification = "new value";
}
});
alert("value updated. specification:" + cart[1].specification);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
相关文章:
- 将值输入到对象,然后该对象推送到数组
- 如何在鼠标悬停时将对象从起始位置移动到结束位置,然后在鼠标悬停后再次移动
- 搜索包含值的json对象键,然后取消设置
- jQuery Deferred and promise-错误:对象没有't支持属性或方法'然后'
- 使用函数for循环遍历对象以更改值,然后返回结果
- 尝试将对象添加到存储阵列中,然后通过循环将它们写出
- 将普通的 PNG 图像转换为 JSON 数据,然后存储到对象
- 存储多个Json对象,然后对其进行排序
- 我想使用replace函数扫描json对象,然后用字符串替换匹配的单词
- 如何在javascript中生成数组对象的数组,然后将其传递给java
- 从数组中快速打印对象,然后循环
- 根据属性值创建多个对象数组,然后遍历每个数组
- 找到对象中值最高的键,然后将其发布到innerHTML中
- 将JSON字符串转换为JavaScript对象,然后创建一个HTML表
- 无法更新 Javascript 对象文本中的值,然后更新页面
- 复制对象,然后更新 JSON 对象中的值
- 使用 .push 对对象进行分组,然后输出到字符串
- 在函数中创建 jQuery 对象然后不使用它是否会产生内存泄漏
- 访问'这'promise回调中的对象(然后)
- 声明一个javascript对象.然后使用jQuery和Ajax设置属性