這裏有一個快速的jsfiddle與我的版本的答案:http://jsfiddle.net/JohnMunsch/3NMGD/
注:兩個的jsfiddle及以下已更新的代碼,以反映該變更的要求題。
var model = [
{
color: "red",
age: 10,
size: [ "small", "large" ]
},
{
color: "red",
age: 11,
size: [ "small", "large" ]
},
{
color: "red",
age: 9,
size: [ "small", "large" ]
}
];
function findCommonalities(data) {
if (data.length > 0) {
// It's safe enough to get the list of keys from the very first
// element. If the later ones differ, you know that the keys they
// had but the first element didn't are guaranteed not to be in
// the common set anyway because the first element didn't
// have them.
var keys = _.keys(data[0]);
var commonalities = { };
_.each(keys,
function (key) {
var values = _.pluck(data, key);
if (values.length == data.length) {
// Sadly calling _.uniq() won't work when the values
// plucked out are arrays themselves. It calls ===
// and that's not sufficient for arrays.
if (_.isArray(values[0])) {
// However, we can get a little tricky here.
// What if we _.zip() together all of the arrays
// (assuming the ordering for each array is the
// same) then we'll end up with an array of
// arrays where each one can again be tested
// with _.uniq() because each one will contain
// the same value taken from each array.
var zippedValues = _.zip(values);
console.log("zippedValues", zippedValues);
if (!_.find(zippedValues,
function (zippedValue) {
var uniqueValues = _.uniq(zippedValue);
// Note: This test is the inverse of the
// one below. We're trying to find any
// array that has more than one value in
// it. If we do then there's some
// variance.
return uniqueValues.length != 1;
})) {
// We didn't find any arrays that had any
// variance so we want this as well.
commonalities[key] = values[0];
}
} else {
var uniqueValues = _.uniq(values);
if (uniqueValues.length == 1) {
commonalities[key] = uniqueValues[0];
}
}
}
}
);
return commonalities;
} else {
return { };
}
}
console.log("commonalities: ", findCommonalities(model));
性能優良似乎一個小數字鍵和少量的物品,但你需要有一百萬條記錄和大量鍵來測試它。
如果您還有其他問題,請發帖提問 – tkone 2012-04-27 14:54:29
@tkone真的嗎?即使它只是同一個問題的一個變種?這對我來說似乎很奇怪。 – 2012-04-27 16:07:38
@Kevin Whitaker我不清楚在這種情況下,如果兩個數組是「尺寸:[」小「,」大「]和」尺寸:[「小」],那麼通用性會是什麼。這種情況還是「尺寸:[」小「]」,因爲他們都有一個小尺寸的紅色? – 2012-04-27 16:09:13