使用 Ramda 从数组数组中删除数组?
Remove array from array of arrays using Ramda?
是否有任何 shorthand 选项可以使用 Ramda 库从数组的数组中删除数组?
Items to remove: [[1, 2], [a, b]]
Remove from: [[g, d], [5, 11], [1, 2], [43, 4], [a, b]]
Result: [[g, d], [5, 11], [43, 4]]
使用 vanilla JavaScript,您可以复制两个数组中的每一个,.map()
返回数组元素的 string
表示。
然后遍历您的可移动项目数组并使用 indexOf()
检查您复制的数组中是否存在每个项目。
你的代码应该是这样的:
var arr = [["g", "d"], [5, 11], [1, 2], [43, 4], ["a", "b"]];
var strArr = arr.map(function(a){
return a.join(",");
});
var toRemove = [[1, 2], ["a", "b"]];
var strToRemove = toRemove.map(function(el){
return el.join(",");
});
strToRemove.forEach(function(a){
if(strArr.indexOf(a)>-1){
arr.splice(strArr.indexOf(a), 1);
strArr.splice(strArr.indexOf(a), 1);
}
});
演示:
var arr = [
["g", "d"],
[5, 11],
[1, 2],
[43, 4],
["a", "b"]
];
var strArr = arr.map(function(a) {
return a.join(",");
});
var toRemove = [
[1, 2],
["a", "b"]
];
var strToRemove = toRemove.map(function(el) {
return el.join(",");
});
strToRemove.forEach(function(a) {
if (strArr.indexOf(a) > -1) {
arr.splice(strArr.indexOf(a), 1);
strArr.splice(strArr.indexOf(a), 1);
}
});
console.log(arr);
R.reject, R.either and R.equals的组合可以实现这个。
const data = [['g', 'd'], [5, 11], [1, 2], [43, 4], ['a', 'b']]
const fn = R.reject(R.either(R.equals(['a', 'b']), R.equals([1, 2])))
console.log(fn(data))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
使用R.difference with R.flip:
const data = [['g', 'd'], [5, 11], [1, 2], [43, 4], ['a', 'b']]
const itemsToRemove = [[1, 2], ['a', 'b']]
const fn = R.flip(R.difference)(itemsToRemove);
console.log(fn(data))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
这可能是最佳答案
使用R.reject and R.contains
var Itemstoremove = [[1, 2], [a, b]]
var Removefrom = [[g, d], [5, 11], [1, 2], [43, 4], [a, b]]
var Result = R.reject(R.contains(R.__, Itemstoremove), Removefrom)
console.log(Result)
只需使用以下代码行:
const data = [
['g', 'd'],
[5, 11],
[1, 2],
[43, 4],
['a', 'b']
]
const itemsToRemove = [
[1, 2],
['a', 'b']
];
console.log(R.difference(data, itemsToRemove));
是否有任何 shorthand 选项可以使用 Ramda 库从数组的数组中删除数组?
Items to remove: [[1, 2], [a, b]]
Remove from: [[g, d], [5, 11], [1, 2], [43, 4], [a, b]]
Result: [[g, d], [5, 11], [43, 4]]
使用 vanilla JavaScript,您可以复制两个数组中的每一个,.map()
返回数组元素的 string
表示。
然后遍历您的可移动项目数组并使用 indexOf()
检查您复制的数组中是否存在每个项目。
你的代码应该是这样的:
var arr = [["g", "d"], [5, 11], [1, 2], [43, 4], ["a", "b"]];
var strArr = arr.map(function(a){
return a.join(",");
});
var toRemove = [[1, 2], ["a", "b"]];
var strToRemove = toRemove.map(function(el){
return el.join(",");
});
strToRemove.forEach(function(a){
if(strArr.indexOf(a)>-1){
arr.splice(strArr.indexOf(a), 1);
strArr.splice(strArr.indexOf(a), 1);
}
});
演示:
var arr = [
["g", "d"],
[5, 11],
[1, 2],
[43, 4],
["a", "b"]
];
var strArr = arr.map(function(a) {
return a.join(",");
});
var toRemove = [
[1, 2],
["a", "b"]
];
var strToRemove = toRemove.map(function(el) {
return el.join(",");
});
strToRemove.forEach(function(a) {
if (strArr.indexOf(a) > -1) {
arr.splice(strArr.indexOf(a), 1);
strArr.splice(strArr.indexOf(a), 1);
}
});
console.log(arr);
R.reject, R.either and R.equals的组合可以实现这个。
const data = [['g', 'd'], [5, 11], [1, 2], [43, 4], ['a', 'b']]
const fn = R.reject(R.either(R.equals(['a', 'b']), R.equals([1, 2])))
console.log(fn(data))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
使用R.difference with R.flip:
const data = [['g', 'd'], [5, 11], [1, 2], [43, 4], ['a', 'b']]
const itemsToRemove = [[1, 2], ['a', 'b']]
const fn = R.flip(R.difference)(itemsToRemove);
console.log(fn(data))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
这可能是最佳答案
使用R.reject and R.contains
var Itemstoremove = [[1, 2], [a, b]]
var Removefrom = [[g, d], [5, 11], [1, 2], [43, 4], [a, b]]
var Result = R.reject(R.contains(R.__, Itemstoremove), Removefrom)
console.log(Result)
只需使用以下代码行:
const data = [
['g', 'd'],
[5, 11],
[1, 2],
[43, 4],
['a', 'b']
]
const itemsToRemove = [
[1, 2],
['a', 'b']
];
console.log(R.difference(data, itemsToRemove));