当前位置: 代码迷 >> JavaScript >> 使用多个键/值对查找JSON对象,然后更新该Object的其他属性
  详细解决方案

使用多个键/值对查找JSON对象,然后更新该Object的其他属性

热度:106   发布时间:2023-06-05 15:53:50.0

特定

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

使用的简单解决方案

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": ""
  }
]

注意:这需要ES6。

您可能想尝试以下代码:

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库。 你也可以在这里运行代码

迭代数组可能效率低下。 为了提高性能,您可以对所有索引值进行字符串化,并使用它们将对象存储在散列映射中以便快速查找。 就像是:

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> 

  相关解决方案