2017-02-22 80 views
0

在這裏,我有兩個不同長度的數組。然後一個數組將返回兩個數組中不常見的值。但編譯器給出錯誤的輸出。這些功能有哪些問題? 輸出:在這種情況下[4,5]而不是[4]。比較兩個不同長度的數組並返回一個具有不常見元素的數組

function diffArray(arr1, arr2) { 
    var newArr = []; 
    var y=[]; 
    var z=[]; 
    // Same, same; but different. 
    var flag=0; 
    for(var i=0;i<arr1.length;i++){ 
    if(arr2.indexOf(arr1[i]===-1)){ 
     z=arr1.slice(i,i+1); 
     //return z; 
    } 
    for(var j=0;j<arr2.length;j++){ 
     if(arr1.indexOf(arr2[j])===-1){ 
     y=arr2.slice(j,j+1); 
     //z=arr1.slice(i,i+1); 
     //break; 
     } 
    } 
    } 
    return newArr.concat(y,z); 
} 

diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]); 
diffArray(["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"]); 
+0

'編譯器是給錯了output'? –

+0

[4,5]作爲輸出而不是[5] @sᴜʀᴇsʜᴀᴛᴛᴀ – aayushi

+0

爲什麼你期待[5]?並不罕見[4] –

回答

0

代碼,書面,只能返回最多兩個項目,因爲yz總是與長度爲1的新陣列時z=arr1.slice(i,i+1);y=arr2.slice(j,j+1);被稱爲覆蓋。您可能想要使用Array.push,即z.push(arr1[i]);y.push(arr2[j]);。這會在每次找到元素時添加到同一個數組中,而不是每次都重置結果數組。

+0

即使使用push(),預期的輸出也不會發生! @dncook – aayushi

1

嘗試以下操作:

function diffArray (arr1, arr2) { 
    var z = arr1.filter(function (value) { return !~arr2.indexOf(value); }); 
    var y = arr2.filter(function (value) { return !~arr1.indexOf(value); }); 

    return [].concat(y, z); 
} 
+0

將「conact」更改爲「concat」也許...... – gyre

+0

哦,是的。當然。 Thx – floriangosse

+0

做什麼!〜操作員呢?我無法在谷歌上找到它。 @floriangosse – aayushi

1

您可以嘗試爲你的函數

a1 = [1, 2, 3, 5]; 
a2 = [1, 2, 3, 4, 5]; 
result = []; 
if (a1.length > a2.length) { 
    temp = a1; 
    a1 = a2; 
    a2 = temp; 
} 

$.grep(a2, function(k) { 
     if ($.inArray(k, a1) == -1) result.push(k); 
}); 
console.log(result);, 

這裏的替代工作jsfiddle您都陣列集。

試試看,這會起作用。

+0

在這種情況下,如果arr1的大小大於arr2,該怎麼辦? @rahul_m – aayushi

+0

我已經添加了更小和更大的條件,檢查函數(k)中的語句 – rahulsm

+0

是否會自動從a2中取值,還是需要在某處定義它?我是javascript新手 – aayushi

0

您可以合併數組並返回唯一值。

function diffArray(a1, a2){ 
 
    var data = a1.concat(a2); 
 
    return data.filter(function(item, i, a){ 
 
    return a.indexOf(item) === a.lastIndexOf(item) 
 
    }); 
 
} 
 

 
console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5])); 
 
console.log(diffArray([1, 2, 3, 5], [11, 12, 13, 14, 5]));

0

試試這個

var newArr = []; 
    function diffArray(arr1, arr2) { 


      arr1.forEach(function (item) { 
       if (arr2.indexOf(item) === -1) 
        newArr.push(item); 
      }); 

      arr2.forEach(function (item) { 
       if (arr1.indexOf(item) === -1) 
        newArr.push(item); 
      }); 

    } 

    diffArray(["andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"]); 
+0

[「安山」,「草地」,「污垢」,「粉紅色的羊毛」,「死亡的灌木」],[「閃長巖」,「安山岩」,「草」,「污垢」 「]應該返回[」閃長巖「,」粉紅色的羊毛「]。它不適用於此! @Mairaj – aayushi

+0

@aayushi更新了答案。 – Mairaj

1

在你的代碼有這樣幾行:

z=arr1.slice(i,i+1); 
y=arr2.slice(j,j+1); 

如果你這樣做,每次你得到一個獨特的元素,你將失去之前存儲的一個。

另外,Array.prototype.slice返回一個數組,因此您也不需要使用slice()

function diffArray(arr1, arr2) { 
    var newArr = []; 
    var y=[]; 
    var z=[]; 

    var flag=0; 
    for(var i=0;i<arr1.length;i++) { 
    if(arr2.indexOf(arr1[i])===-1) { 
     z.push(arr1[i]); 
    } 
    } 

    for(var j=0;j<arr2.length;j++) { 
    if(arr1.indexOf(arr2[j])===-1) { 
     y.push(arr2[j]); 
    } 
    } 

    return y.concat(z); 
} 

這應該對您有幫助。

這裏是一個fiddle顯示相同。

1
function diffArray(arr1, arr2) { 
    var newArr = []; 

    var firstArray = arr1; 
    var secondArray = arr2; 
    if (arr2.length > arr1.length) { 
    firstArray = arr2; 
    secondArray = arr1; 
    } 

    var isNotMatched = false; 

    for (var i in firstArray) { 
    for (var j in secondArray) { 
     if (firstArray[i] !== secondArray[j]) { 
     isNotMatched = true; 
     } else { 
     isNotMatched = false; 
     break; 
     } 

    } 

    if (isNotMatched) 
     newArr.push(firstArray[i]); 

    } 

    return newArr; 
} 

diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]); 

所有

function diffArray(arr1, arr2) { 
    var newArr = []; 
    var firstArray = arr1; 
    var secondArray = arr2; 
    if (arr2.length > arr1.length) { 
    firstArray = arr2; 
    secondArray = arr1; 
    } 

    var whenSameLegth = ''; 
    var isNotMatched = false; 

    for (var i in firstArray) { 
    for (var j in secondArray) { 
     if (firstArray[i] !== secondArray[j]) { 
     isNotMatched = true; 
     whenSameLegth = secondArray[j]; 
     } else { 
     isNotMatched = false; 
     break; 
     } 

    } 
    if (isNotMatched && arr2.length === arr1.length) { 
     newArr.push(firstArray[i]); 
     newArr.push(whenSameLegth); 
    } else if (isNotMatched) { 
     newArr.push(firstArray[i]); 
    } 
    } 

    return newArr; 
} 

diffArray(第2版工作[ 「安山岩」, 「小草」, 「泥土」, 「粉紅色羊毛」, 「死灌木」],[ 「閃長巖」, 「安山」,「草」,「污垢」,「死亡的灌木」]);

+0

請使用上面的功能它工作我檢查。 –

+0

[「安山岩」,「草地」,「泥土」,「粉紅色的羊毛」,「死亡的灌木」],[「閃長巖」,「安山岩」,「草地」,「泥土」 「閃石」,「粉紅色的羊毛」]。它不適用於此! @ love-Kesh – aayushi

+0

請現在檢查第二個verion @aayushi –

0

如果您可以使用最新版本的JavaScript(ES6),下面的代碼應該能夠在線性時間內運行,而不是二次時間 - O(N)與O(N²)。

function diffArray(a, b) { 
 
    a = new Set(a) 
 
    let result = [] 
 
    for (let value of b) { 
 
    a.delete(value) || result.push(value) 
 
    } 
 
    result.push(...a) 
 
    return result 
 
} 
 

 
console.log(diffArray(
 
    [1, 2, 3, 5], 
 
    [1, 2, 3, 4, 5] 
 
)) 
 
console.log(diffArray(
 
    ["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], 
 
    ["diorite", "andesite", "grass", "dirt", "dead shrub"] 
 
))

0

你可以使用一個哈希表和計數的發生。它也適用於數組中的多個equla元素。

function getSymmetricDifference(a1, a2) { 
 
    var hash = {}; 
 
    a1.forEach(function (a) { 
 
     (hash[a] = hash[a] || { count: 0, value: a }).count++; 
 
    }); 
 
    a2.forEach(function (a) { 
 
     (hash[a] = hash[a] || { count: 0, value: a }).count--; 
 
    }); 
 
    return Object.keys(hash).filter(function (a) { return hash[a].count; }).map(function (a) { return hash[a].value; }); 
 
} 
 

 
console.log(getSymmetricDifference([1, 2, 3, 5], [1, 2, 3, 4, 5])); 
 
console.log(getSymmetricDifference(["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"]));

相關問題