[英]How to find differences between n arrays of objects
我有一個名為props
的數組,其中包含n
個對象數組,所有數組包含相同數量的對象。
每個對象有4個屬性: participation_enabled
, name
, pathing_enabled
, id
和這些屬性可以在其他陣列同一屬性的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.