我有一个对象数组,每个对象都有一个左右元素。在某些情况下,在数组内,左边可能等于右边,反之亦然,对于阵列中的不同对象。这些“重复”需要删除。
例如,我有一个像这样的对象数组......
[
{"left":"cow","right":"pig"},
{"left":"horse","right":"pig"},
{"left":"rabbit","right":"pig"},
{"left":"bird","right":"pig"},
{"left":"bear","right":"pig"},
{"left":"cow","right":"bird"},
{"left":"horse","right":"bird"},
{"left":"pig","right":"bird"},
{"left":"cow","right":"horse"},
{"left":"bird","right":"horse"},
{"left":"pig","right":"horse"},
{"left":"rabbit","right":"horse"},
{"left":"horse","right":"cow"},
{"left":"pig","right":"cow"},
{"left":"bird","right":"cow"},
{"left":"bear","right":"cow"},
{"left":"horse","right":"rabbit"},
{"left":"pig","right":"rabbit"},
{"left":"bear","right":"rabbit"},
{"left":"pig","right":"bear"},
{"left":"rabbit","right":"bear"},
{"left":"cow","right":"bear"}
]
我需要将其过滤到唯一的对,就像这样......
[
{"left":"cow","right":"pig"},
{"left":"horse","right":"pig"},
{"left":"rabbit","right":"pig"},
{"left":"bird","right":"pig"},
{"left":"bear","right":"pig"},
{"left":"cow","right":"bird"},
{"left":"horse","right":"bird"},
{"left":"cow","right":"horse"},
{"left":"rabbit","right":"horse"},
{"left":"bear","right":"cow"},
{"left":"bear","right":"rabbit"}
]
使用javascript。
答案 0 :(得分:3)
您将需要使用Array.prototype.filter,以及一个基本对象来跟踪触摸的对。
var input = [ ... ];
var pairs = {};
var output = input
.filter(function(item) {
if (pairs[item.left] == item.right ||
pairs[item.right] == item.left)
return false;
pairs[item.left] = item.right;
return true;
});
答案 1 :(得分:0)
嗯,跟踪项目的最简单方法是创建地图。我们会把它视为一套。我们将简单地对左右项进行排序,对它们进行哈希处理,然后通过为键分配值true
将计算出的哈希值存储到地图中。当我们稍后到达相同的哈希时,我们将知道我们已经标记了该对。副本将被过滤掉。
我从用户hashing logic借用了下面的LordVlad。您可以提供自己的散列方法。
document.body.innerHTML = printItems(pruneItems(getItems()));
function pruneItems(items) {
var hashes = {};
return items.filter(function(item, idx, arr) {
var hash = hashStr([item.left, item.right].sort().join(''));
if (hashes[hash] !== true) {
return (hashes[hash] = true);
}
return false
}, []);
}
function hashStr(str) {
return str.split('').reduce(function(res, ch) {
res = ((res << 5) - res) + ch.charCodeAt(0);
return res & res
}, 0);
}
function printItems(items) {
return '[\n' + items.map(function(item) {
return '\t' + JSON.stringify(item).replace(/([,])/g, '$1 ');
}).join('\n') + '\n]\n';
}
function getItems() {
return [
{ "left": "cow", "right": "pig" },
{ "left": "horse", "right": "pig" },
{ "left": "rabbit", "right": "pig" },
{ "left": "bird", "right": "pig" },
{ "left": "bear", "right": "pig" },
{ "left": "cow", "right": "bird" },
{ "left": "horse", "right": "bird" },
{ "left": "pig", "right": "bird" },
{ "left": "cow", "right": "horse" },
{ "left": "bird", "right": "horse" },
{ "left": "pig", "right": "horse" },
{ "left": "rabbit", "right": "horse" },
{ "left": "horse", "right": "cow" },
{ "left": "pig", "right": "cow" },
{ "left": "bird", "right": "cow" },
{ "left": "bear", "right": "cow" },
{ "left": "horse", "right": "rabbit" },
{ "left": "pig", "right": "rabbit" },
{ "left": "bear", "right": "rabbit" },
{ "left": "pig", "right": "bear" },
{ "left": "rabbit", "right": "bear" },
{ "left": "cow", "right": "bear" }
];
}
&#13;
body {
font-family: monospace;
white-space: pre;
}
&#13;
[
{"left":"cow", "right":"pig"}
{"left":"horse", "right":"pig"}
{"left":"rabbit", "right":"pig"}
{"left":"bird", "right":"pig"}
{"left":"bear", "right":"pig"}
{"left":"cow", "right":"bird"}
{"left":"horse", "right":"bird"}
{"left":"cow", "right":"horse"}
{"left":"rabbit", "right":"horse"}
{"left":"bear", "right":"cow"}
{"left":"bear", "right":"rabbit"}
]
答案 2 :(得分:0)
尝试使用Array.prototype.forEach()
,Array.prototype.some()
,RegExp.prototype.test()
var res = [];
arr.forEach(function(val, key) {
var re = new RegExp(val.left + "|" + val.right);
if (!res.some(function(v, k) {
return re.test(v.left) && re.test(v.right)
})) {
res.push(val)
}
});
var arr = [{
"left": "cow",
"right": "pig"
}, {
"left": "horse",
"right": "pig"
}, {
"left": "rabbit",
"right": "pig"
}, {
"left": "bird",
"right": "pig"
}, {
"left": "bear",
"right": "pig"
}, {
"left": "cow",
"right": "bird"
}, {
"left": "horse",
"right": "bird"
}, {
"left": "pig",
"right": "bird"
}, {
"left": "cow",
"right": "horse"
}, {
"left": "bird",
"right": "horse"
}, {
"left": "pig",
"right": "horse"
}, {
"left": "rabbit",
"right": "horse"
}, {
"left": "horse",
"right": "cow"
}, {
"left": "pig",
"right": "cow"
}, {
"left": "bird",
"right": "cow"
}, {
"left": "bear",
"right": "cow"
}, {
"left": "horse",
"right": "rabbit"
}, {
"left": "pig",
"right": "rabbit"
}, {
"left": "bear",
"right": "rabbit"
}, {
"left": "pig",
"right": "bear"
}, {
"left": "rabbit",
"right": "bear"
}, {
"left": "cow",
"right": "bear"
}];
var res = [];
arr.forEach(function(val, key) {
var re = new RegExp(val.left + "|" + val.right);
if (!res.some(function(v, k) {
return re.test(v.left) && re.test(v.right)
})) {
res.push(val)
}
});
console.log(arr, JSON.stringify(arr, null, 2)
, res, JSON.stringify(res, null, 2));
document.querySelector("pre").textContent = JSON.stringify(res, null, 2)
<pre></pre>