我有一个数组:
var items = [[1,1,2,2,3,3,4,4,5,5],[0,0,0,1,0,1,0,1,0,1]];
换句话说,我想循环遍历items [0]和items [1]的元素并收集所有元素,直到找到item [0]的三个唯一值。
我想要的输出是:
output = [[1,1,2,2,3,3],[0,0,0,1,0,1]];
答案 0 :(得分:2)
如果我理解正确,那么以下内容就可以满足您的需求。
function threeDistincts(items) {
var distincts = 0, inArr = false;
for (var i = 0; i < items[0].length; i++) {
inArr = false;
for (var j = 0; j < i; j++) {
if (items[0][j] === items[0][i]) {
inArr = true;
break;
}
}
if (!inArr) distincts++;
if (distincts === 4) break;
}
items[0].length = items[1].length = i;
}
称之为:
var items = [[1,1,2,2,3,3,3,4,5,5],[0,0,0,1,0,1,0,1,0,1]];
threeDistincts(items);
// items = [[1,1,2,2,3,3],[0,0,0,1,0,1]];
此函数的另一个版本,使用indexOf
(如DTing建议的那样),将内循环(在原始函数中)仅限制为不同的元素,但考虑高complexity of Array.indexOf
和{{ 1}}实现,不能保证更好的性能。
Array.push
答案 1 :(得分:1)
使用较新的Set
和Array.prototype.findIndex
JavaScript功能,可以通过es6-shim为旧版浏览器进行填充。
// limitTo3DistinctFromFirst :: [[a], [b]] -> [[a], [b]]
function limitTo3DistinctFromFirst(items) {
var uniques = new Set(),
indexOfFourth = items[0].findIndex(fourthUnique);
return items.map(sliceToFourth);
// fourthUnique :: a -> Boolean
function fourthUnique(el) {
if (uniques.has(el)) return false;
uniques.add(el);
return uniques.size === 4;
}
// sliceToFourth :: [a] -> [a]
function sliceToFourth(a) {
return a.slice(0, indexOfFourth);
}
}
答案 2 :(得分:0)
如果对象可以清洗,您可以使用对象跟踪您看到的唯一项目数:
如果您想在添加第三个唯一值后停止:
var items = [[1,1,2,2,3,3,4,4,5,5],[0,0,0,1,0,1,0,1,0,1]];
function solve(items) {
var obj = Object.create(null);
var seen = 0;
var i = -1;
while (++i < items[0].length && seen < 3) {
var element = items[0][i];
if (element in obj) continue;
obj[element] = true;
seen++;
}
return [items[0].slice(0,i), items[1].slice(0,i)];
};
document.getElementById('result').innerHTML = JSON.stringify(solve(items));
&#13;
<pre id="result"></pre>
&#13;
如果你想在看到第4个唯一值时突破循环,你可以这样做:
var items = [[1,1,2,2,3,3,4,4,5,5],[0,0,0,1,0,1,0,1,0,1]];
function solve(items) {
var obj = Object.create(null);
var seen = 0;
var i = -1;
while (++i < items[0].length && seen < 4) {
var element = items[0][i];
if (element in obj) continue;
obj[element] = true;
seen++;
}
return [items[0].slice(0,i-1), items[1].slice(0,i-1)];
};
document.getElementById('result').innerHTML = JSON.stringify(solve(items));
&#13;
<pre id="result"></pre>
&#13;
答案 3 :(得分:0)
您可以将对象用作一组来跟踪已选择的唯一值的数量。这有利于防止不必要的迭代。
belongsToMany