2017-07-27 48 views
-3

該函數返回兩個對象之間的diff,我需要修改它以返回通用對象。任何幫助表示讚賞。兩個對象中的通用對象

陣列的樣品:

var array1 = [{ 
    "Name": "Single", 
    "URL": "xxx", 
    "ID": 123 
}, { 
    "Name": "Double", 
    "URL": "yyy", 
    "ID": 888 
}, { 
    "Name": "Triple", 
    "URL": "zzz", 
    "ID": 567 
}]; 

var arrar2 = [{ 
    "Name": "Single", 
    "URL": "xxx", 
    "ID": 123 
}, { 
    "Name": "Double", 
    "URL": "yyy", 
    "ID": 888 
}, { 
    "Name": "index", 
    "URL": "zzz", 
    "ID": 567 
}]; 

// expected result 
var resultArray = [{ 
    "Name": "Single", 
    "URL": "xxx", 
    "ID": 123 
}, { 
    "Name": "Double", 
    "URL": "yyy", 
    "ID": 888 
}, 
}]; 

當前代碼:

function objDiff(array1, array2) { 
    var resultArray = [] 

    array2.forEach(function(destObj) { 
    var check = array1.some(function(origObj) { 
     if (origObj.name == destObj.name) return true 
    }) 
    if (!check) { 
     destObj.desc = 'missing in source' 
     resultArray.push(destObj) 
    } 
    }) 

    array1.forEach(function(origObj) { 
    var check = array2.some(function(destObj) { 
     if (origObj.name == destObj.name) return true 
    }) 
    if (!check) { 
     origObj.desc = 'missing in destination' 
     resultArray.push(origObj) 
    } 
    }) 

    return resultArray 
} 
+0

如何也供給一些樣品物體與對其進行測試。 –

+1

你需要對你目前的思維過程給出一些指示。我們需要知道你在批判性地思考你的問題。在當前狀態下,您將失去所有代表,因爲這聽起來像「我必須修改此代碼,但我不知道如何,請爲我做我的工作」。而不是,「我很好奇x,y,z,我試過a,b和c」。 – marcusshep

+0

我已添加示例對象 –

回答

0

這不是你的代碼,但下面的功能將通過探索有兩個forEach()環兩個數組返回所有比賽。算法複雜度由array1.length * array2.length給出。不要用於大型數組!但這是想到它的最簡單的方法。事實上,我想到的第一個想法是檢查array1的每個元素,並對它們進行比較。

var array1 = ['DETE', 'Ivany', 'James', 'Don', 'Crakcer'] 
 
var array2 = ['Jamies', 'Ivanyy', 'DETE', 'Don'] 
 

 
function objMatch(array1,array2) { 
 
    
 
    var matches = []; 
 
    
 
    array1.forEach(function(element1) { 
 
    
 
     array2.forEach(function(element2) { 
 
     
 
     if(element1 == element2) { 
 
      
 
      matches.push(element1); 
 
      
 
     } 
 
     
 
     }); 
 
    
 
    }); 
 

 
    return matches; 
 

 
} 
 

 
console.log(objMatch(array1, array2)); 
 
// will return ['DETE', 'Don']

另一種方法只有一個循環是利用Array.prototype.filter使用sort(),信貸jeremy

var array1 = ["cat", "sum","fun", "run", "gut"]; 
 
var array2 = ["bat", "cat","dog","sun", "hut", "gut"]; 
 

 
var arrayMatch = function(array1, array2) { 
 

 
    var matches = []; 
 
    
 
    array1.sort(); 
 
    array2.sort(); 
 
    
 
    for (var i = 0; i < array1.length; i += 1) { 
 
    
 
    if (array2.indexOf(array1[i]) > -1) { 
 
     matches.push(array1[i]); 
 
    } 
 
    } 
 
    
 
    return matches; 
 

 
} 
 
console.log(arrayMatch(array1,array2))

然而另一種方式來做到這一點是,存入Paul S.

var array1 = ['DETE', 'Ivany', 'James', 'Don', 'Crakcer'] 
 
var array2 = ['Jamies', 'Ivanyy', 'DETE', 'Don'] 
 

 
function arrayMatch(array1, array2) { 
 
    var t; 
 
    if (array1.length > array2.length) t = array2, array2 = array1, array1 = t; 
 
    
 
    return array1.filter(function (e) { 
 
     return array2.indexOf(e) > -1; 
 
    }); 
 
} 
 

 
console.log(arrayMatch(array1, array2));

0

如果你想要的是尋找的事情是在兩個數組一樣,你只需要循環其中之一。沿着這些線路的東西應該工作:

function objSame(array1, array2) { 
    var resultArray = [] 

    array2.forEach(function(destObj) { 
     var check = array1.some(function(origObj) { 
      if(origObj.name == destObj.name) return true 
     }) 
     if(check) { 
      destObj.desc = 'Same in both' 
      resultArray.push(destObj) 
     } 
    }) 
    return resultArray 
} 
0

要找到有共同Name屬性值數組元素,你可以使用一個Map避免O(N²)時間複雜度。該映射將會有來自第一個數組的對象,這些對象由其名稱進行鍵控。將它作爲this對象到filter第二陣列上:

function objCommon(array1, array2) { 
 
    return array2.filter(function (obj) { 
 
     return this.has(obj.Name); 
 
    }, new Map(array1.map(obj => [obj.Name, obj]))); 
 
} 
 

 
var array1= [ 
 
    { "Name": "Single", "URL": "xxx", "ID": 123 }, 
 
    { "Name": "Double", "URL": "yyy", "ID": 888}, 
 
    { "Name": "Triple", "URL": "zzz", "ID": 567 }]; 
 

 
var array2= [ 
 
    { "Name": "Single", "URL": "xxx", "ID": 123 }, 
 
    { "Name": "Double", "URL": "yyy", "ID": 888 }, 
 
    { "Name": "index", "URL": "zzz", "ID": 567 }]; 
 

 
var result = objCommon(array1, array2); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }