我正在尋找一種從數組中刪除重複值的簡單方法。我想出瞭如何檢測是否存在重複,只是我不知道如何從價值中「推」它。例如,如果你去提供的鏈接,然後鍵入,「abca」(按回車/每個字母后回車鍵) ..它會提醒「重複!」刪除陣列中的重複項目Javascript
但我也想弄清楚如何從textarea中刪除重複?
這是一個似乎沒有工作::部分
sort = sort.push(i);
textVal = sort;
return textVal;
我正在尋找一種從數組中刪除重複值的簡單方法。我想出瞭如何檢測是否存在重複,只是我不知道如何從價值中「推」它。例如,如果你去提供的鏈接,然後鍵入,「abca」(按回車/每個字母后回車鍵) ..它會提醒「重複!」刪除陣列中的重複項目Javascript
但我也想弄清楚如何從textarea中刪除重複?
這是一個似乎沒有工作::部分
sort = sort.push(i);
textVal = sort;
return textVal;
爲什麼這樣做硬盤的方式,它可以更容易地使用JavaScript過濾函數,它是專門爲這種操作來完成:
var arr = ["apple", "bannana", "orange", "apple", "orange"];
arr = arr.filter(function(item, index, inputArray) {
return inputArray.indexOf(item) == index;
});
---------------------
Output: ["apple", "bannana", "orange"]
這是我創建的功能/使用了刪除重複:
var removeDuplicatesInPlace = function (arr) {
var i, j, cur, found;
for (i = arr.length - 1; i >= 0; i--) {
cur = arr[i];
found = false;
for (j = i - 1; !found && j >= 0; j--) {
if (cur === arr[j]) {
if (i !== j) {
arr.splice(i, 1);
}
found = true;
}
}
}
return arr;
};
var removeDuplicatesGetCopy = function (arr) {
var ret, len, i, j, cur, found;
ret = [];
len = arr.length;
for (i = 0; i < len; i++) {
cur = arr[i];
found = false;
for (j = 0; !found && (j < len); j++) {
if (cur === arr[j]) {
if (i === j) {
ret.push(cur);
}
found = true;
}
}
}
return ret;
};
因此,使用第一個,這是你的代碼看起來如何:
function cleanUp() {
var text = document.getElementById("fld"),
textVal = text.value,
array;
textVal = textVal.replace(/\r/g, " ");
array = textVal.split(/\n/g);
text.value = removeDuplicatesInPlace(array).join("\n");
}
謝謝。這工作得很好! – Matthew
您可以輕鬆地只是一個對象做到這一點:
function removeDuplicates(text) {
var seen = {};
var result = '';
for (var i = 0; i < text.length; i++) {
var char = text.charAt(i);
if (char in seen) {
continue;
} else {
seen[char] = true;
result += char;
}
}
return result;
}
function cleanUp() {
var elem = document.getElementById("fld");
elem.value = removeDuplicates(elem.value);
}
請考慮:'result + = char in seen? '':可見[char] = char;' – RobG
您可以使用Array.reduce()
刪除重複項。你需要一個輔助對象來跟蹤一個物品被看到的次數。
function cleanUp()
{
var textBox = document.getElementById("fld"),
array = textBox.value.split(/\r?\n/g),
o = {},
output;
output = array.reduce(function(prev, current) {
var key = '$' + current;
// have we seen this value before?
if (o[key] === void 0) {
prev.push(current);
o[key] = true;
}
return prev;
}, []);
// write back the result
textBox.value = output.join("\n");
}
的reduce()
步驟的輸出可以直接用於填充再次文本區,在不影響原有的排列順序。
arr3 = [1, 2, 3, 2, 4, 5];
unique = [];
function findUnique(val)
{
status = '0';
unique.forEach(function(itm){
if(itm==val)
{
status=1;
}
})
return status;
}
arr3.forEach(function(itm){
rtn = findUnique(itm);
if(rtn==0)
unique.push(itm);
});
console.log(unique); // [1, 2, 3, 4, 5]
基於user2668376解決方案,這將返回一個沒有重複的新數組。
Array.prototype.removeDuplicates = function() {
return this.filter(function (item, index, self) {
return self.indexOf(item) == index;
});
};
之後,你可以這樣做:
[1, 3, 3, 7].removeDuplicates();
結果會; [1, 3, 7]
。
那麼,如果用戶2668376已經回答了這個解決方案,爲什麼要重複呢?順便說一句,你有太多的「自我」。 – Bergi
他的解決方案沒有.prototype。在我看來,使用它會好得多。我刪除了var self = this; –
我認爲,2014年,EcmaScript 5時代已經進入五年,而IE8低於世界瀏覽器份額的10%,我們可以放心地稱這是正確的答案。如果有人關心支持舊版本的IE,可以使用EC5的polyfill庫。 – Semicolon
(我會注意到雖然'過濾器'在90%的時間內是正確的答案,但在其他地方可能會引用原始數組的情況下它本身並不合適,因爲它會創建一個新數組,而原始數組對象保持不變。) – Semicolon