按其中一个数组的前3个唯一值切片数组

时间:2015-06-23 22:49:31

标签: javascript arrays

我有一个数组:

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]];

4 个答案:

答案 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]];

Working Fiddle

此函数的另一个版本,使用indexOf(如DTing建议的那样),将内循环(在原始函数中)仅限制为不同的元素,但考虑高complexity of Array.indexOf和{{ 1}}实现,不能保证更好的性能。

Array.push

答案 1 :(得分:1)

使用较新的SetArray.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)

如果对象可以清洗,您可以使用对象跟踪您看到的唯一项目数:

如果您想在添加第三个唯一值后停止:

&#13;
&#13;
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;
&#13;
&#13;

如果你想在看到第4个唯一值时突破循环,你可以这样做:

&#13;
&#13;
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;
&#13;
&#13;

答案 3 :(得分:0)

您可以将对象用作一组来跟踪已选择的唯一值的数量。这有利于防止不必要的迭代。

belongsToMany