I have an array of strings.
For e.g. column_list=["ab","bc","cd","asv_a","asv_f","asv_l","asv_x", "xy","yz"].
Now I have another array with only the"asv_" value(which can be repeated or unique).
For e.g. new_column = ["asv_b", "asv_f", "asv_s"].
Now I want to create a new array by concatenating the new_column array to column_list such that all the asv_ values be together in the middle and unique.
Expected outcome -
result = ["ab","bc","cd","asv_a","asv_f","asv_l","asv_x","asv_b", "asv_s", "xy","yz"]
You can use method mergedArr to create an array with Array.prototype.reduce() to keep the order and then with Object.values() and Array.prototype.flat() to build the result as a Set of unique values
Code:
const column_list = ["ab","bc","cd","asv_a","asv_f","asv_l","asv_x", "xy","yz"]
const new_column = ["asv_b", "asv_f", "asv_s"]
const mergedArr = (arr, newArr) => Object
.values(
arr.reduce(
(a, c, i) => (a[c.startsWith('asv_') ? 1 : !a[1].length ? 0 : 3].push(c), a),
[[], [], newArr, []]
)
)
.flat()
const result = [...new Set(mergedArr(column_list, new_column))]
console.log(result)
First, create a Set of asv_* values in column_list for use in eliminating duplicates
const asvValues = new Set(column_list.filter(v => v.startsWith("asv_")));
Then filter out duplicates
const inserts = new_column.filter(v => !asvValues.has(v));
Now, find the index of the last asv_ entry
const lastAsv = column_list.lastIndexOf([...asvValues].pop());
Now use splice() to insert the filtered array after the position found
column_list.splice(lastAsv + 1, 0, ...inserts);
const column_list=["ab","bc","cd","asv_a","asv_f","asv_l","asv_x", "xy","yz"];
const new_column = ["asv_b", "asv_f", "asv_s"];
const asvValues = new Set(column_list.filter((v) => v.startsWith("asv_")));
const inserts = new_column.filter((v) => !asvValues.has(v));
const lastAsv = column_list.lastIndexOf([...asvValues].pop());
column_list.splice(lastAsv + 1, 0, ...inserts);
console.log(column_list);