簡體   English   中英

如何找到n個對象數組之間的差異

[英]How to find differences between n arrays of objects

我有一個名為props的數組,其中包含n個對象數組,所有數組包含相同數量的對象。

每個對象有4個屬性: participation_enablednamepathing_enabledid和這些屬性可以在其他陣列同一屬性的ID不同的值...

我的目標是找到在其他對象數組中不同的所有對象屬性,並將它們存儲在另一個名為diffs數組中。

讓我們來看下面的例子:

[
  [
    {participation_enabled:"false", name:"PropEins", pathing_enabled:"true", id:"prop1"}, 
    {participation_enabled:"false", name:"User Status", pathing_enabled:"false", id:"prop2"}, 
    {participation_enabled:"false", name:"Initial ID", pathing_enabled:"false", id:"prop3"}, 
    {participation_enabled:"false", name:"User ID", pathing_enabled:"false", id:"prop4"}, 
    {participation_enabled:"false", name:"Subdomain", pathing_enabled:"false", id:"prop5"}
  ], 
  [
    {participation_enabled:"false", name:"PropEins", pathing_enabled:"false", id:"prop1"}, 
    {participation_enabled:"false", name:"Room", pathing_enabled:"false", id:"prop2"}, 
    {participation_enabled:"false", name:"Phase", pathing_enabled:"false", id:"prop3"}, 
    {participation_enabled:"false", name:"Custom Insight 4", pathing_enabled:"false", id:"prop4"}, 
    {participation_enabled:"false", name:"Subdomain", pathing_enabled:"false", id:"prop5"}
  ], 
  [
    {participation_enabled:"true", name:"PropEins", pathing_enabled:"true", id:"prop1"}, 
    {participation_enabled:"true", name:"User Status", pathing_enabled:"true", id:"prop2"}, 
    {participation_enabled:"true", name:"Trackingcode", pathing_enabled:"true", id:"prop3"}, 
    {participation_enabled:"false", name:"User ID", pathing_enabled:"false", id:"prop4"}, 
    {participation_enabled:"false", name:"Subdomain", pathing_enabled:"false", id:"prop5"}
  ]
]

對於上面的示例, diffs數組應包含以下對象:

[
  {id:"prop1", participation_enabled:["false","true"], pathing_enabled:["false","true"], index:0},
  {id:"prop2", participation_enabled:["false","true"], name:["User Status","Room"], participation_enabled:["false","true"], pathing_enabled:["false","true"], index:1},
  {id:"prop3", participation_enabled:["false","true"], name:["Initial ID","Phase","Trackingcode"], participation_enabled:["false","true"], pathing_enabled:["false","true"], index:2},
  {id:"prop4", name:["User ID","Custom Insight 4"], pathing_enabled:["false","true"], index:3}
]

任何建議,不勝感激。

不是最優雅的方式。 但它可以使用下划線JS。

希望這對您有幫助。 另外添加一些錯誤處理將是一個好主意。

編輯添加支持以使用Google下划線方法。 現在所有工作。 https://sites.google.com/site/scriptsexamples/custom-methods/underscoregs#TOC-_values-Object-obj-

 var a = [ [ {participation_enabled:"false", name:"PropEins", pathing_enabled:"true", id:"prop1"}, {participation_enabled:"false", name:"User Status", pathing_enabled:"false", id:"prop2"}, {participation_enabled:"false", name:"Initial ID", pathing_enabled:"false", id:"prop3"}, {participation_enabled:"false", name:"User ID", pathing_enabled:"false", id:"prop4"}, {participation_enabled:"false", name:"Subdomain", pathing_enabled:"false", id:"prop5"} ], [ {participation_enabled:"false", name:"PropEins", pathing_enabled:"false", id:"prop1"}, {participation_enabled:"false", name:"Room", pathing_enabled:"false", id:"prop2"}, {participation_enabled:"false", name:"Phase", pathing_enabled:"false", id:"prop3"}, {participation_enabled:"false", name:"Custom Insight 4", pathing_enabled:"false", id:"prop4"}, {participation_enabled:"false", name:"Subdomain", pathing_enabled:"false", id:"prop5"} ], [ {participation_enabled:"true", name:"PropEins", pathing_enabled:"true", id:"prop1"}, {participation_enabled:"true", name:"User Status", pathing_enabled:"true", id:"prop2"}, {participation_enabled:"true", name:"Trackingcode", pathing_enabled:"true", id:"prop3"}, {participation_enabled:"false", name:"User ID", pathing_enabled:"false", id:"prop4"}, {participation_enabled:"false", name:"Subdomain", pathing_enabled:"false", id:"prop5"} ] ]; var diff = {}; a.forEach(function(val, i){ //first just init start object if (i == 0) { val.forEach(function(v1, ind){ diff[v1.id] = {}; diff[v1.id].index = [ind]; for (var key in v1) { diff[v1.id][key] = [v1[key]]; } }); } else { //for all other values add them into array and remove dups val.forEach(function(v1){ var id = v1.id; for (var key in v1) { diff[id][key].push(v1[key]); } }); } }); //now finalize data removing all that have only unique values for (var key in diff) { var nested = diff[key]; var index = nested.index.pop(); for (nestedKey in nested) { nested[nestedKey] = _.filter(nested[nestedKey], function(item, pos) { return nested[nestedKey].indexOf(item) == pos; }); if (nested[nestedKey].length < 2) {delete nested[nestedKey];} } diff[key].id = key; diff[key].index = index if (_.keys(diff[key]).length < 3) {delete diff[key];} } diff = _.values(diff); console.log(diff); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script> 

一個純粹的js示例。 請注意,如果可以確定所有屬性都包含字符串, indexOf可以使用基於對象屬性的方法替換indexOf搜索,以更快地檢查重復項。

重要假設:

  • 數組中對象的索引確定匹配的對象

 var sampleData = [ [ {participation_enabled:"false", name:"PropEins", pathing_enabled:"true", id:"prop1"}, {participation_enabled:"false", name:"User Status", pathing_enabled:"false", id:"prop2"}, {participation_enabled:"false", name:"Initial ID", pathing_enabled:"false", id:"prop3"}, {participation_enabled:"false", name:"User ID", pathing_enabled:"false", id:"prop4"}, {participation_enabled:"false", name:"Subdomain", pathing_enabled:"false", id:"prop5"} ], [ {participation_enabled:"false", name:"PropEins", pathing_enabled:"false", id:"prop1"}, {participation_enabled:"false", name:"Room", pathing_enabled:"false", id:"prop2"}, {participation_enabled:"false", name:"Phase", pathing_enabled:"false", id:"prop3"}, {participation_enabled:"false", name:"Custom Insight 4", pathing_enabled:"false", id:"prop4"}, {participation_enabled:"false", name:"Subdomain", pathing_enabled:"false", id:"prop5"} ], [ {participation_enabled:"true", name:"PropEins", pathing_enabled:"true", id:"prop1"}, {participation_enabled:"true", name:"User Status", pathing_enabled:"true", id:"prop2"}, {participation_enabled:"true", name:"Trackingcode", pathing_enabled:"true", id:"prop3"}, {participation_enabled:"false", name:"User ID", pathing_enabled:"false", id:"prop4"}, {participation_enabled:"false", name:"Subdomain", pathing_enabled:"false", id:"prop5"} ] ]; // Reduce an array of data arrays into one array of merged objects function dataReducer (matches, current) { current.forEach(function(obj, i) { if (!matches[i]) { matches[i] = obj; } else { matches[i] = mergeObj(matches[i], obj); } }); return matches; }; // Merge two matching objects function mergeObj(obj1, obj2) { Object.keys(obj1).forEach(function(key) { if (obj1[key] !== obj2[key]) { obj1[key] = [].concat(obj1[key]); if (obj1[key].indexOf(obj2[key]) == -1) { obj1[key].push(obj2[key]); } } }); return obj1; }; var result = sampleData.reduce(dataReducer, []); console.log(result); 

檢查以下代碼。 可能這不是最佳方法,但可以解決問題。

 var mainArray = [ [{ participation_enabled: "false", name: "PropEins", pathing_enabled: "true", id: "prop1" }, { participation_enabled: "false", name: "User Status", pathing_enabled: "false", id: "prop2" }, { participation_enabled: "false", name: "Initial ID", pathing_enabled: "false", id: "prop3" }, { participation_enabled: "false", name: "User ID", pathing_enabled: "false", id: "prop4" }, { participation_enabled: "false", name: "Subdomain", pathing_enabled: "false", id: "prop5" }], [{ participation_enabled: "false", name: "PropEins", pathing_enabled: "false", id: "prop1" }, { participation_enabled: "false", name: "Room", pathing_enabled: "false", id: "prop2" }, { participation_enabled: "false", name: "Phase", pathing_enabled: "false", id: "prop3" }, { participation_enabled: "false", name: "Custom Insight 4", pathing_enabled: "false", id: "prop4" }, { participation_enabled: "false", name: "Subdomain", pathing_enabled: "false", id: "prop5" }], [{ participation_enabled: "true", name: "PropEins", pathing_enabled: "true", id: "prop1" }, { participation_enabled: "true", name: "User Status", pathing_enabled: "true", id: "prop2" }, { participation_enabled: "true", name: "Trackingcode", pathing_enabled: "true", id: "prop3" }, { participation_enabled: "false", name: "User ID", pathing_enabled: "false", id: "prop4" }, { participation_enabled: "false", name: "Subdomain", pathing_enabled: "false", id: "prop5" }] ]; var resultArray = mainArray[0]; for (var i = 0; i < mainArray.length; i++) { var arrayTocheck = mainArray[i]; for (var outer = 0; outer < resultArray.length; outer++) { row = resultArray[outer]; if (i == 0) { row.participation_enabled = []; row.name = []; row.pathing_enabled = []; } for (var inner = 0; inner < resultArray.length; inner++) { var rowtoCheck = arrayTocheck[inner]; if (row.id == rowtoCheck.id) { if (!row.participation_enabled.includes(rowtoCheck.participation_enabled) && rowtoCheck.participation_enabled != "") { row.participation_enabled.push(rowtoCheck.participation_enabled); } if (!row.name.includes(rowtoCheck.name) && rowtoCheck.name != "") { row.name.push(rowtoCheck.name); } if (!row.pathing_enabled.includes(rowtoCheck.pathing_enabled) && rowtoCheck.pathing_enabled != "") { row.pathing_enabled.push(rowtoCheck.pathing_enabled); } break; } } resultArray[outer] = row; } } console.log(resultArray); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM