我需要回圈思考兩個陣列并回傳另一個具有不同值的陣列。
兩個陣列的示例:
let arr1 = ['one' , 'two' , 'three'];
let arr2 = ['four' , 'one' , 'two'];
我需要什么?
回圈認為陣列并回傳相同的值,我希望新陣列像:
let res = [
{ name : 'one' , isSame: true },
{ name : 'two' , isSame: true },
{ name : 'three' },
{ name : 'four' }
];
我洗掉了重復的專案并將isSame重復值的值添加到 true 。
一和二重復(兩次)。
我試過的
let arr3 = arr1.map((item, i) =>
Object.assign({}, item, arr2[i])
);
但是我得到了一個拆分陣列,它被重復洗掉了
uj5u.com熱心網友回復:
我建議你用reduce()它來做
let arr1 = ['one' , 'two' , 'three'];
let arr2 = ['four' , 'one' , 'two'];
let arr3 = arr1.concat(arr2)
let result = arr3.reduce((a,c) =>{
let obj = a.find(i => i.name == c)
if(obj){
obj['isSame'] = true
}else{
a.push({'name':c})
}
return a
},[])
console.log(result)
更新:沒有的解決方案reduce(),set()用于洗掉重復元素,并includes()用于查找重復元素
let arr1 = ['one' , 'two' , 'three'];
let arr2 = ['four' , 'one' , 'two'];
let arr3 = [...new Set(arr1.concat(arr2))]
let result = arr3.map(a =>{
let data = {'name':a}
if(arr1.includes(a) && arr2.includes(a)){
data["isSame"] = true
}
return data
})
console.log(result)
uj5u.com熱心網友回復:
減少到中間物件,然后映射該物件的條目:
const arr1 = ['one' , 'two' , 'three'];
const arr2 = ['four' , 'one' , 'two'];
const result = Object.entries([...arr1, ...arr2].reduce(
(a, v) => ({ ...a, [v]: v in a }),
{}
)).map(([name, isSame]) => ({ name, isSame }));
console.log(result);
回呼中的傳播行為reduce()增加了時間復雜度,有利于更簡潔,但可以很容易地避免,從而制定此解決方案O(n):
const arr1 = ['one' , 'two' , 'three'];
const arr2 = ['four' , 'one' , 'two'];
const result = Object.entries([...arr1, ...arr2].reduce(
(a, v) => {
a[v] = v in a;
return a;
},
{}
)).map(([name, isSame]) => ({ name, isSame }));
console.log(result);
uj5u.com熱心網友回復:
由于您不想減少,您可以遍歷每個專案,并檢查接下來的幾個值。
這本身更快,函式呼叫更少,只有兩個 for 回圈。
let arr1 = ['one', 'two', 'three'];
let arr2 = ['four', 'one', 'two'];
console.log(merge(arr1, arr2));
function merge(a, b) {
const merged = a.concat(b); // combine arrays
const result = [];
let stop = merged.length; // create a variable for when to stop
for(let i = 0; i < stop; i ) {
const current = merged[i];
let same = false;
// look through the rest of the array for indexes
for(let t = i 1; t < stop; t ) {
if(current === merged[t]) {
same = true;
merged.splice(t, 1); // remove duplicate elements from the array so we don't come across it again
stop--; // we've removed an element from the array, so we have to stop 1 earlier
// we don't break this loop because there may be more than 2 occurences
}
}
const out = { name: current };
if(same) out.isSame = true;
result.push(out);
}
return result;
}
uj5u.com熱心網友回復:
- 我用過
map()陣列的功能。 map()通過對每個有效條目執行代碼邏輯來回傳新陣列。[...new Set([...arr1, ...arr2])],這將回傳具有唯一值的新陣列。- 我假設,您正在檢查值是否在兩個陣列中,并基于我們正在回傳物件。
let arr1 = ['one', 'two', 'three'];
let arr2 = ['four', 'one', 'two'];
let mergedArray = [...new Set([...arr1, ...arr2])];
let result = mergedArray.map(value => {
if (arr1.includes(value) && arr2.includes(value)) {
return {
value,
isInBothArray: true
}
} else {
return {
value,
isInBothArray: false
}
}
});
console.log(result);
uj5u.com熱心網友回復:
const arr1 = ['one' , 'two' , 'three'];
const arr2 = ['four' , 'one' , 'two'];
// returns the duplicate values in the two arrays
const findDuplicates = (arr) => {
let sorted_arr = arr.slice().sort();
let results = [];
for (let i = 0; i < sorted_arr.length - 1; i ) {
if (sorted_arr[i 1] == sorted_arr[i]) {
results.push(sorted_arr[i]);
}
}
return results;
}
let values = ([...new Set([...arr1, ...arr2])]);
let duplicates = findDuplicates(values);
let retval = [];
for(let i = 0; i < values.length; i ) {
let isSame = duplicates.includes(values[i]);
retval.push({name: values[i], isSame: isSame})
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/535443.html
標籤:javascript
