【问题标题】:Find json element within object and remove it在对象中查找 json 元素并将其删除
【发布时间】:2014-04-30 18:54:36
【问题描述】:

使用 jquery,我将如何查找 JSON 对象的索引。

以下是创建的内容:

[{"itemid":3,"itemName":"这里有一些文字","itemPrice":"£2.40"},{"itemid":3,"itemName":"这里有一些文字","itemPrice ":"£2.40"},{"itemid":2,"itemName":"这里有一些文字","itemPrice":"£2.40"}]

这是它在控制台中的翻译方式:

[对象,对象,对象] 0:对象 itemName: "这里有一些文字" 商品价格:“2.40 英镑” 物品编号:3 __proto__: 对象 1:对象 itemName: "这里有一些文字" 商品价格:“2.40 英镑” 物品编号:3 __proto__: 对象 2:对象 itemName: "这里有一些文字" 商品价格:“2.40 英镑” 物品编号:2 __proto__: 对象 长度:3 __proto__: 数组[0]

如果我想通过搜索 itemid 作为要查找的值来查看字符串,然后返回并使用 splice 从字符串中删除它,代码会是什么样子。我不断收到奇怪的错误。

这是我的代码:

这将创建 json 字符串: var item = {"itemid" : itemId, "itemName" : itemName, "itemPrice" : itemPrice};

cOrder.push(item);
localStorage.setItem('cOrder', JSON.stringify(cOrder));

在这里我搜索字符串以获取要删除的正确元素:

var itemid = ($(this).text());
console.log(cOrder);
$.each(cOrder, function(key, value) {
    if(value.itemid == itemid) {
    // Here i need to get the index of the object //
    console.log(Object.keys(cOrder).indexOf(this));
    }
});

以上述为例。如果我想删除 itemid 3,我需要删除对象索引 1 (1 : Object)

如何获取索引 1,然后将其从字符串中删除?

提前致谢

【问题讨论】:

  • var itemid = ($(this).text()); 不是把itemid 变成一个字符串吗?使用if(value.itemid == itemid) {,您正在将整数与字符串进行比较? JavaScript 类型比较有时会让我失望...
  • 我不敢说实话。当我查找 itemid 时,它会触发一个真正的 IF 语句。

标签: jquery json


【解决方案1】:

对于数组,您不能在循环中从数组的开头开始并删除项目...如果这样做,循环计数器和索引将彼此分离。您可能需要在循环期间创建第二个数组并将有效项添加到辅助数组。

与 id 匹配的项目:

var validItems = [];
$.each(cOrder, function(key, value) {
    if(value.itemid == itemid) {
        validItems.push(value);
    }
});

与 id 不匹配的项目:

var validItems = [];
$.each(cOrder, function(key, value) {
    if(value.itemid != itemid) {
        validItems.push(value);
    }
});

或两者兼有:

var validItems = [];
var invalidItems = [];
$.each(cOrder, function(key, value) {
    if(value.itemid == itemid) 
        validItems.push(value);
    else
        invalidItems.push(value);
});

更新

这可能有助于您解决数量问题。您必须向您的对象添加一个 itemQuantity 属性来支持这一点。使用该属性,您可以创建如下函数:

//quantity can be positive or negative
function adjustItemQuantity(itemId, quantity, remove) {
    //if no quantity, or quantity==0, and not remove then nothing to do here
    if (!quantity && !remove) return;

    //create the temporary array
    var validItems = [];

    $.each(cOrder, function(key, value) {
        if(value.itemid == itemId) {
            var newQuantity = value.itemQuantity + quantity;

            //remove if quantity 0 or less
            if (newQuantity > 0 && !remove)
                validItems.push(value);
        } else {
            //add the other, non-matching items to the array
            validItems.push(value);
        }
    });

    //set the main array to the new result
    cOrder = validItems;
}

【讨论】:

  • 太棒了,我完全没有想到要这样做。谢谢你的朋友。
  • 这存在逻辑问题,如果这个人订购了几件相同的物品(即相同的itemid)并删除了所有物品而不是一个。试图决定最好的方法是什么?
  • 所以混合中也有一个数量变量。您的对象已经有了名称、ID 和描述。可能应该添加一个数量属性。我继续并用可能的解决方案更新了我的答案......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 2019-05-01
  • 2018-05-07
相关资源
最近更新 更多