示例 1: 我有一個這樣的陣列
let arrayA = ["task A - memberA", "task A - memberB", "task B - memberA"]
我想知道是否有兩個成員在執行相同的任務,然后從后面的任務中洗掉,預期的輸出應該是:
arrayA = ["task A - memberA", "task B - memberA"]
示例 2:
let arrayA = [{task: "Task A", member: "MemberA"},{task: "Task A", member: "MemberB"},{task: "Task B", member: "MemberB"}]
謝謝,
uj5u.com熱心網友回復:
通過使用reduce方法,
- 在'-'之前獲取子字串,即任務名稱
- 檢查 pv 中是否存在任務名稱
- 如果 reduce 函式的 pv (previousValue) 陣列不包含任務,則將新任務添加到其中。
提示:
某些方法回傳 true 或 false
包括方法回傳 true 或 false
substr方法從字串回傳子字串,即任務名稱
請參閱 MDN 教程以獲取更多詳細資訊
let arr = ["task A - memberA", "task A - memberB", "task B - memberA"]
let result = arr.reduce((pv,cv) => {
if(!pv.some(e => e.includes(cv.substr(0, cv.indexOf('-')).trim()))) pv.push(cv)
return pv
},[])
console.log(result)
uj5u.com熱心網友回復:
創建一個Set跟蹤活動任務的。
然后遍歷tasks陣列并通過拆分字串來提取task,然后如果task不存在則將Set其推送到結果陣列。
let tasks = ["task A - memberA", "task A - memberB", "task B - memberA"];
function getUniqueTasks(tasks) {
const activeTasks = new Set();
const uniqueTasks = [];
tasks.forEach((t) => {
const [task] = t.split(" - ");
if (!activeTasks.has(task)) {
uniqueTasks.push(t);
activeTasks.add(task);
}
});
return uniqueTasks;
}
console.log(getUniqueTasks(tasks));
如果您正在尋找一個花哨的襯里,請參考以下解決方案:
const
data = ["task A - memberA", "task A - memberB", "task B - memberA"],
filterer = (s) => (d, _i, _a, t = d.split(" - ")[0]) => !s.has(t) && s.add(t),
result = data.filter(filterer(new Set()));
console.log(result);
相關檔案:
- 設定 - JavaScript
- Array.prototype.forEach
- Array.prototype.filter
- String.prototype.split
uj5u.com熱心網友回復:
您可以將一個Set和一個函式用于字串中想要的唯一部分。
const
getTask = s => s.split(' - ', 1)[0],
uniqueBy = fn => s => v => (w => !s.has(w) && s.add(w))(fn(v)),
data = ["task A - memberA", "task A - memberB", "task B - memberA"],
result = data.filter(uniqueBy(getTask)(new Set));
console.log(result);
uj5u.com熱心網友回復:
例如:
const arrayA = ["task A - memberA", "task A - memberB", "task B - memberA"];
function removeDuplicateTasks(tasksArray) {
// Use set as a temporary data structure to "remember" tasks names
const tasks = new Set();
// Arrays have .filter() method that iterates over elements of the
// array and uses callback function to "decide" whether given
// element should be filtered out. Returning true from the callback
// tells the .filter() method to let that element pass through.
let filteredTasks = tasksArray.filter(function (task, taskIndex, tasksArr) {
const taskName = task.split('-')[0].trim();
if (!tasks.has(taskName)) {
// This task name was not yet used
tasks.add(taskName);
// So do not throw it away but let it pass through to filteredTasks array
return true;
}
});
return filteredTasks;
}
const cleanedArrayA = removeDuplicateTasks(arrayA);
如果我是你,我會考慮使用不同的資料結構來表示成員 - 任務關系。
uj5u.com熱心網友回復:
您可以使用map,filter和的組合findIndex來僅獲取每個特定任務的第一個條目。
首先,用于map將陣列轉換為更易于使用的陣列,即[task, member]條目陣列。
然后,過濾該陣列,以便僅回傳那些位于您可以找到其特定任務的第一個位置的專案。
let arrayA = ["task A - memberA", "task A - memberB", "task B - memberA"];
const assignments = arrayA.map(t => t.split(' - '));
const filtered = assignments.filter(
([task], i) => assignments.findIndex(
([t]) => t === task) === i);
console.log(filtered);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/492289.html
標籤:javascript 数组 细绳 相比
下一篇:型別錯誤:onChangeImage不是函式。(在'onChangeImage(result.uri)'中,'onChangeImage'未定義)]
