我有一个名为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}
]任何建议都非常感谢。
发布于 2016-09-09 09:45:24
不是最优雅的方式。但它使用下划线JS工作。
希望这能帮到你。此外,添加一些错误处理将是一个好主意。
编辑添加支持使用Google下划线方法。现在一切都应该正常了。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>
发布于 2016-09-09 10:01:06
一个纯粹的js例子。请注意,如果可以确保所有属性都包含字符串,则可以使用基于对象属性的方法替换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);
发布于 2016-09-09 10:38:52
检查下面的代码。也许这不是最理想的方法,但它解决了问题。
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);
https://stackoverflow.com/questions/39408031
复制相似问题