让我先解释一下我正在努力解决的问题.
我有一个现有的标签列表(键值对),当UI对话框打开时,将首先加载这些标签.
标签的示例如下:
const existingTags = [{
"key": "t1",
"value": "v1"
}, {
"key": "t2",
"value": "v2"
}
];
const modifiedTags = [{"key": "t1", "value": "v1"}, {"key": "t2", "value": "v2"}, {"key": "t3", "value": "v3"},];
我试过的代码是:(它在某种程度上是有效的,但并不优雅).如果可能的话,寻找一些元素解决方案.
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Arrays</h1>
<h2>The concat() Method</h2>
<p id="demo">TagsToBeAdded</p>
<p id="demo1">TagsToBeRemoved</p>
<p id="demo2">FinalAddList</p>
<script>
const existingTags = [{
"key": "t1",
"value": "v1"
}, {
"key": "t2",
"value": "v2"
}
];
const modifiedTags = [{"key": "t1", "value": "v1"}, {"key": "t2", "value": "v2"}, {"key": "t3", "value": "v3"},];
const tagsToBeAdded = modifiedTags.filter(item1 => !existingTags.some(item2 => (item2.key === item1.key && item2.value === item1.value)));
let tagsToBeDeleted = existingTags.filter(item1 => modifiedTags.some(item2 => (item2.key === item1.key && item2.value !== item1.value)));
const tagsToBeRetained = existingTags.filter(item1 => !tagsToBeDeleted.some(item2 => (item2.key === item1.key && item2.value === item1.value)));
if (!tagsToBeAdded.length && !tagsToBeDeleted.length) {
tagsToBeDeleted = existingTags.filter(item1 => !modifiedTags.some(item2 => (item2.key === item1.key)));
}
const finalTagsListToBeAdded= tagsToBeRetained.concat(tagsToBeAdded);
const children = JSON.stringify(tagsToBeAdded);
const children1 = JSON.stringify(tagsToBeDeleted);
const children2 = JSON.stringify(finalTagsListToBeAdded);
document.getElementById("demo").innerHTML = children
document.getElementById("demo1").innerHTML = children1
document.getElementById("demo2").innerHTML = children2
</script>
</body>
</html>
一些示例:
// Input
const existingTags = [{
"key": "t1",
"value": "v1"
}, {
"key": "t2",
"value": "v2"
}
];
const modifiedTags = [{"key": "t1", "value": "v1"}, {"key": "t2", "value": "v21"}, {"key": "t3", "value": "v3"}];
// Expected output:
tagsToBeAdded: [{"key":"t2","value":"v21"},{"key":"t3","value":"v3"}]
tagsToBeDeleted: [{"key":"t2","value":"v2"}]
finalTagsList: [{"key":"t1","value":"v1"},{"key":"t2","value":"v21"},{"key":"t3","value":"v3"}]
// Input:
const existingTags = [{
"key": "t1",
"value": "v1"
}, {
"key": "t2",
"value": "v2"
}
];
const modifiedTags = [{"key": "t1", "value": "v1"}, {"key": "t2", "value": "v2"}, {"key": "t3", "value": "v3"}];
// Expected output:
tagsToBeAdded: [{"key":"t3","value":"v3"}]
tagsToBeDeleted: []
finalTagsList: [{"key":"t1","value":"v1"},{"key":"t2","value":"v2"},{"key":"t3","value":"v3"}]
// Input:
const existingTags = [{
"key": "t1",
"value": "v1"
}, {
"key": "t2",
"value": "v2"
}
];
const modifiedTags = [{"key": "t1", "value": "v1"}]; // t2:v2 is removing
// Expected output:
tagsToBeAdded: []
tagsToBeDeleted: [{"key":"t2","value":"v2"}]
finalTagsList: [{"key":"t1","value":"v1"}]
// Input:
const existingTags = [{
"key": "t1",
"value": "v1"
}, {
"key": "t2",
"value": "v2"
}
];
const modifiedTags = []; // all tags are dropped
// Expected output:
tagsToBeAdded: []
tagsToBeDeleted: [{"key":"t1","value":"v1"},{"key":"t2","value":"v2"}]
finalTagsList: []
Lodash也可以.