在javascript

时间:2019-01-13 17:55:26

标签: javascript angular

在某些情况下在数组中添加或删除对象时遇到问题。我有2个数组finalArr和referenceArr。

1)可以为finalArr数组添加和删除对象。 referenceArr数组仅供参考。

2)仅当finalArr中的nonEdit为true时,才能删除对象。

3)有3个属性应该比较编号,类型和nonEdit。例如  {number: "8080", type: "abcd", nonEdit: true....}对象同时存在,因此保留在finalArr中,但是{ number: "6767", type: "xyzd", nonEdit: true,..}该对象不存在于referenceArr中,应将其删除。

4)应该添加finalArr中不存在的对象。例如,应该将这两个不存在的对象{ number: "7777", type: "efg", nonEdit: true..}{ number: "8888", type: "xyz", nonEdit: true..}添加到finalArr数组。

let referenceArr = [{ number: "8080", type: "abcd", nonEdit: true,externalPort: false, position: "right1" },
{ number: "7777", type: "efg", nonEdit: true,  externalPort: false, position: "right1" },
{ number: "8888", type: "xyz", nonEdit: true, externalPort: false, position: "right1" }]

let finalArr = [{ number: "8084", type: "sdsd", nonEdit: false,  externalPort: false, position: "right1" },
             { number: "8083", type: "sdse", nonEdit: false,  externalPort: false, position: "right1" },
             { number: "8080", type: "abcd", nonEdit: true,  externalPort: false, position: "right0" },
             { number: "6767", type: "xyzd", nonEdit: true, externalPort: true, position: "right3" }]

///这是最终输出

   finalArr = [{ number: "8084", type: "sdsd", nonEdit: false,  externalPort: false, position: "right1" },
                 { number: "8083", type: "sdse", nonEdit: false,  externalPort: false, position: "right1" },
                 { number: "8080", type: "abcd", nonEdit: true,  externalPort: false, position: "right0" },
                 { number: "7777", type: "efg", nonEdit: true,  externalPort: false, position: "right1" },
                 { number: "8888", type: "xyz", nonEdit: true, externalPort: false, position: "right1" 

}] 

请帮助我解决此问题。我觉得有点困难。

2 个答案:

答案 0 :(得分:0)

希望我能正确理解您的问题。请尝试以下解决您的需求:

updateArray(refArr: any[], finalArr: any[] {

    // Remove all entries in finalArr, which are not in refArr
    for(let i = 0; i < finalArr.length; i ++) {
        const entry = finalArr[i];
        // Sorry! I used the wrong array here
        const refEntry = refArr.find(
            (e) => e.number === entry.number && e.type === entry.type && e.nonEdit === entry.nonEdit
        );
        // Removes the entry form finalArr 
        // in case it's not in the refArr and nonEdit is true
        if (!refEntry && entry.nonEdit) {
            finalArr.splice(i, 1);
        }
    }

    // Iterate over the refArray
    refArr.forEach(entry => {
        // Search for the entry in the finalArr
        const finalArrEntry = finalArr.find(
            (e) => e.number === entry.number && e.type === entry.type && e.nonEdit === entry.nonEdit
        );

        // If finalArr does not contain the entry, it'll be added
        if (!finalArrEntry) {
            finalArr.push(entry);
        }

    });
}

答案 1 :(得分:0)

已更新:我没有在初始解决方案中过滤最终结果,因此已编辑了解决方案,请重试,让我知道是否适合。 我还在下面提供了另一种可能的解决方案。

    function compareArrays(refArray, finalArray) {

        //Remove any values in final array which have nonEdit set to true and do not match an object in the refence array
        finalArray = finalArray.filter(finalEle => {
            for (let refEle of refArray) {
                return (finalEle.nonEdit === false) || refEle.number === finalEle.number && refEle.type === finalEle.type && refEle.nonEdit === finalEle.nonEdit;
            }
        });

        for (let refEle of refArray) {
            let foundBool = false;

            for (let finalEle of finalArray) {
                //If the 3 mentioned object properties for the current element in the reference array match any element in the 
                // final array. 
                if (refEle.number === finalEle.number && refEle.type === finalEle.type && refEle.nonEdit === finalEle.nonEdit) {
                    foundBool = true;
                }
            }

            //add the element to the final array if it is not already present.
            if (!foundBool) {
                finalArray.push(refEle);
            }
        }
        return finalArray
    }
    console.log(compareArrays(referenceArr, finalArr));

方法2

    function compareArrays(refArray, finalArray) {

        //Remove any values in final array which have nonEdit set to true and do not match an object in the refence array
        let newFinalArray = finalArray.filter(finalEle => {
            for (let refEle of refArray) {
                if((finalEle.nonEdit === false) || refEle.number === finalEle.number && refEle.type === finalEle.type && refEle.nonEdit === finalEle.nonEdit){
                    return true;
                }
            }
            return false;
        });

        //Remove any values from referenceArray which are already present in finalArray
        let newRefArray = refArray.filter(refEle => {
            for (let finalEle of newFinalArray) {
                if(refEle.number === finalEle.number && refEle.type === finalEle.type && refEle.nonEdit === finalEle.nonEdit){
                    return false;
                }
            }
            return true;
        });

        //Return the two arrays merged together
        return newFinalArray.concat(newRefArray)
    }
    console.log(compareArrays(referenceArr, finalArr));