#javascript #arrays #algorithm #loops #sub-array
#javascript #массивы #алгоритм #циклы #подмассив
Вопрос:
Я обдумываю следующую логику, но мне все еще чего-то не хватает.
Учитывая массив, подобный const testArr = ["F", "F", "C", "C", "F", "C", "F"]
.
Результирующий массив должен выглядеть следующим образом ["F", "F", ["C", "C"], "F", ["C"], "F"]
.
Код, который я придумал до сих пор, выглядит следующим образом:
const grouping = (arr) => {
const result = [];
arr.forEach((item, index) => {
if (item === "C") {
const subArr = new Array();
subArr.push(item);
if (arr[index 1] !== "C") {
result.push(subArr);
}
} else {
result.push(item);
}
});
return resu<
};
console.log(grouping(testArr));
В данный момент выводится результат:
["F", "F", ["C"], "F", ["C"], "F"]
Я ценю ваши подсказки 🙂
Ответ №1:
Вы могли бы использовать цикл while с временным индексом для достижения ожидаемого результата
Ниже приведены небольшие изменения из вашего текущего решения (измените на for
цикл и используйте while
для проверки условий)
const testArr = ["F", "F", "C", "C", "F", "C", "F"]
const grouping = (arr) => {
const result = []
for (let index = 0; index < arr.length; index ) {
if (arr[index] === "C") {
const subArr = [arr[index]]
let tempIndex = index 1
while (arr[tempIndex] === "C") {
subArr.push(arr[tempIndex])
index = tempIndex
tempIndex
}
result.push(subArr)
} else {
result.push(arr[index])
}
}
return result
}
console.log(grouping(testArr))
Ответ №2:
Я думаю, что я бы сделал это так, см. Комментарии:
const grouping = arr => {
const result = [];
let currentSub = null;
for (const value of arr) {
// Is it the special value?
if (value === "C") {
// Yes, do we have an active array?
if (!currentSub) {
// No, create one and push it
currentSub = [];
result.push(currentSub);
}
// Add to the active array
currentSub.push(value)
} else {
// Not special, forget active array and push
currentSub = null;
result.push(value);
}
}
return resu<
};
Живой пример:
const testArr = ["F", "F", "C", "C", "F", "C", "F"]
const grouping = arr => {
const result = [];
let currentSub = null;
for (const value of arr) {
// Is it the special value?
if (value === "C") {
// Yes, do we have an active array?
if (!currentSub) {
// No, create one and push it
currentSub = [];
result.push(currentSub);
}
// Add to the active array
currentSub.push(value)
} else {
// Not special, forget active array and push
currentSub = null;
result.push(value);
}
}
return resu<
};
console.log(grouping(testArr));
.as-console-wrapper {
max-height: 100% !important;
}
Если вы предпочитаете forEach
to for-of
, это почти идентично:
const testArr = ["F", "F", "C", "C", "F", "C", "F"]
const grouping = arr => {
const result = [];
let currentSub = null;
arr.forEach(value => {
// Is it the special value?
if (value === "C") {
// Yes, do we have an active array?
if (!currentSub) {
// No, create one and push it
currentSub = [];
result.push(currentSub);
}
// Add to the active array
currentSub.push(value)
} else {
// Not special, forget active array and push
currentSub = null;
result.push(value);
}
});
return resu<
};
console.log(grouping(testArr));
.as-console-wrapper {
max-height: 100% !important;
}
Примечание: В общем, избегайте new Array()
. Чтобы создать пустой массив, просто используйте []
. Чтобы создать массив с записями, используйте [value1, value2]
etc. Вы можете использовать new Array(x)
(или просто Array(x)
) для создания разреженного массива с длиной x
, но обычно это полезно только тогда, когда вы собираетесь использовать fill
его для заполнения одинаковым значением в каждой записи.
Ответ №3:
Я бы использовал временный массив для хранения «специального» значения, и я бы сбрасывал его всякий раз, когда сталкиваюсь с другим значением.
const grouping = (arr) => {
const result = []
let tempC = []
arr.forEach(letter => {
if (letter === 'C') {
tempC.push('C') // Append the special letter to its temp array
} else {
if (tempC.length > 0) {
result.push(tempC) // If the previus iteration had a 'C', push the array in result
}
tempC = [] // Reset the tempC collector
result.push(letter) // Add the 'not special' letter to the result
}
})
return result
}
Ответ №4:
const testArr = ["F", "F", "C", "C", "F", "C", "F"];
const result = testArr.reduce((acc, val) => {
if (val === "C") {
Array.isArray(acc[acc.length - 1]) ? acc[acc.length - 1].push(val) : acc.push([val]);
} else {
acc.push(val);
}
return acc;
}, []);
console.log(result);
Ответ №5:
Это подход, использующий функцию Array.prototype.reduce
, которая является СУХОЙ.
const testArr = ["F", "F", "C", "C", "F", "C", "F"];
const {result} = testArr.reduce((a, e) => {
if (e === a.target) (a.current || (a.current = [])).push(e);
else {
if (a.current) a.result.push(a.current), a.current = undefined;
a.result.push(e);
}
return a;
}, {result: [], current: undefined, target: "C"});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Ответ №6:
void groupElements(int arr[], int n)
{
// Initialize all elements as not visited
bool *visited = new bool[n];
for (int i=0; i<n; i )
visited[i] = false;
// Traverse all elements
for (int i=0; i<n; i )
{
// Check if this is first occurrence
if (!visited[i])
{
// If yes, print it and all subsequent occurrences
cout << arr[i] << " ";
for (int j=i 1; j<n; j )
{
if (arr[i] == arr[j])
{
cout << arr[i] << " ";
visited[j] = true;
}
}
}
}
delete [] visited;
}
Комментарии:
1. Я не уверен, как C будет вписываться в код OP javascript 😉