javascript循环更改其他对象的值

时间:2018-10-31 22:00:03

标签: javascript node.js json

for (var i = 0; i < itemArray.length; i++) {
    //console.log(itemArray[index].mats);
    var newMatArray = [];
    for (var j = 0; j < itemArray[i].mats.length; j++) {
        var mat = itemArray[i].mats[j];
        if (isInNewArray(mat.id, newMatArray)) {
            continue;
        }
        for (var k = 0; k < itemArray[i].mats.length; k++) {
            var mat2 = itemArray[i].mats[k];
            if (k == j) {
                continue;
            }
            if (mat.id == mat2.id) {
                //if (itemArray[i].id == 12005) console.log("adding " + mat.quantity + " of " + mat.name + " to " + mat2.quantity);
                mat.quantity = mat.quantity + mat2.quantity;
            }
        }
        newMatArray.push(mat);
    }
    //if (itemArray[i].id == 12005) console.log(newMatArray);
    itemArray[i].mats = newMatArray;
}

function isInNewArray(id, array) {
for (var i = 0; i < array.length; i++) {
    if (array[i].id == id) {
        return true;
    }
}
return false;
}

因此,此循环应遍历一组项并删除/组合项所需的重复垫子,每个项是一个具有名称/ id和一个mats对象数组的json对象,每个垫子都有一个name / ID /数量要求。由于某种原因,如果我在数组中的某个点仅迭代一项,然后继续进行其余所有操作而不进行合并就可以了。

仅当其循环时,更改先前对象的值似乎会更改未来对象的值,从而导致垫块达到1.17555e ^ 105的数量,该数量远高于其应有的数量。 javascript是否会进行某种内存优化,以将具有相同值的mat对象存储到同一位置,所以当我在循环中较早的对象上增加数量时,它会在循环中的较晚对象上这样做吗?否则,我不明白为什么这种算法只适用于1个对象,但会遍历对象,并且一次只能更改一个对象就搞砸了。

编辑:下面的示例对象

{
    "id": 622,
    "bpid": 692,
    "quantity": 1,
    "name": "Stabber",
    "mats": [
        {
            "id": 34,
            "name": "Tritanium",
            "quantity": 48518335
        },
        {
            "id": 35,
            "name": "Pyerite",
            "quantity": 11828791
        },
        {
            "id": 36,
            "name": "Mexallon",
            "quantity": 40000
        },
        {
            "id": 37,
            "name": "Isogen",
            "quantity": 10333
        },
        {
            "id": 38,
            "name": "Nocxium",
            "quantity": 2778
        },
        {
            "id": 39,
            "name": "Zydrine",
            "quantity": 1244
        },
        {
            "id": 40,
            "name": "Megacyte",
            "quantity": 244
        },
        {
            "id": 20411,
            "name": "Datacore - High Energy Physics",
            "quantity": 8
        },
        {
            "id": 20172,
            "name": "Datacore - Minmatar Starship Engineering",
            "quantity": 8
        }
    ]
}

for (var i = 0; i < matsArray.length; i++) {
    var item = matsArray[i];
    var type = parseInt(item.typeID, 10);
    var index = findItemIndex(type);
    if (index > -1) {
        var mat = {
            id: parseInt(item.materialTypeID, 10),
            name: itemIDMap.get(parseInt(item.materialTypeID, 10)),
            quantity: parseInt(item.quantity, 10)
        }
        itemArray[index].mats.push(mat);
    } else {
        if (bpMap.get(parseInt(item.typeID, 10)) == undefined) {
            //console.log(item);
            continue;
        }
        var newItem = {
            id: bpMap.get(parseInt(item.typeID, 10)).itemID,
            bpid: parseInt(item.typeID, 10),
            quantity: bpMap.get(parseInt(item.typeID, 10)).quantityPerRun,
            name: itemIDMap.get(bpMap.get(parseInt(item.typeID, 10)).itemID),
            mats: []
        }
        var mat = {
            id: parseInt(item.materialTypeID, 10),
            name: itemIDMap.get(parseInt(item.materialTypeID, 10)),
            quantity: parseInt(item.quantity, 10)
        }
        newItem.mats.push(mat);
        itemArray.push(newItem);
        productsArray.push(newItem.id);    
    }
}

此数组创建代码是否会创建相同的mat对象?每个新创建的垫子都不应该是一个单独的对象吗?

0 个答案:

没有答案