在某些情况下在数组中添加或删除对象时遇到问题。我有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"
}]
请帮助我解决此问题。我觉得有点困难。
答案 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));