比较对象并只获取存在于所有对象中的对象



我正在为Mixitup构建一个过滤方法,我需要能够正确过滤x选定的参数。(这里的插件并不重要,这是我如何得到我正确的结束对象)

我目前有一个对象,对于每个唯一搜索都发送一个唯一键,以及它的匹配对象(通过过滤器方法获得)到我的过滤函数。

这就是我迷路的地方。

我需要能够循环遍历我的对象,它的关联键=>值(对象),并且只取出每个对象中存在的对象。

例如(我用jQuery对象代替数字)

var filter = {
    x : {1,3,5,6},
    y : {1,4,7,8},
    z : {1,9}
}

根据上面的例子,唯一返回的对象将是- 1(因为它是所有三个键中唯一存在的对象)。

任何帮助都将非常感激!

Array.reduceArray.filter的简短方法:

基本上它从第一个数组开始作为reduce的起始值。然后通过索引查找对结果集进行过滤,如果找到,则保留该值,否则跳过该值。这个过程一直持续到对象没有更多属性为止。

var filter = {
    x: [1, 3, 5, 6],
    y: [1, 4, 7, 8],
    z: [1, 9]
};
var filtered = Object.keys(filter).reduce(function (r, a, i) {
    return i ? r.filter(function (b) {
        return ~filter[a].indexOf(b);
    }) : filter[a];
}, []);
document.write('<pre>' + JSON.stringify(filtered, 0, 4) + '</pre>');

对象奖励,返回公共键/s:

var filter = {
    x: { a: 'ah', c: 'ce', e: 'eh', f: 'ef' },
    y: { a: 'ah', d: 'de', g: 'ge', h: 'ha' },
    z: { a: 'ah', i: 'ie' }
};
var filtered = Object.keys(filter).reduce(function (r, a, i) {
    return i ? r.filter(function (b) {
        return b in filter[a];
    }) : Object.keys(filter[a]);
}, []);
document.write('<pre>' + JSON.stringify(filtered, 0, 4) + '</pre>');

那么,我将分为两部分:

1查找常用项

2提取常用项

var filter = {
    x : [1,3,5,6],
    y : [1,4,7,8],
    z : [1,9]
}
// Find the common
var common;
Object.keys(filter).forEach(function (k) {
    if (common) {
         for (var i=0; i<common.length; i++) {
             // Check if the common value exists on the key
             if (filter[k].indexOf(common[i]) === -1) {
                 // If it does not, it is not common
                 common.splice(i, 1);
                 i--;
             }
         }
    } else {
        // On the first item, we assume all are common
        common = filter[k]
    }
})
// Additional processing can take place to extract the data you need here
//Should print "[1]"
console.log(common)

这是一个解决方案:这里我使用了相同的数据结构,而没有将其转换为数组

HTML

<p id="result"></p>
JavaScript

var value = 'value',
    filter = {
        x : {1:value,3:value,5:value,6:value,9:value},
        y : {1:value,4:value,7:value,8:value,9:value},
        z : {1:value,9:value}
    };
function getCommon(data) {
    var subObjects = [],
        common = [];
    if(typeof data === 'object'){
        // collect all sub-keys into an array
        Object.keys(data).forEach(function(key){
            if(typeof data[key] === 'object') {
                subObjects = subObjects.concat(Object.keys(data[key]));
            }
        });
        // get the common keys
        Object.keys(data[Object.keys(data)[0]]).forEach(function(subKey){
            if(getCount(subObjects, subKey) === Object.keys(data).length) {
                common.push(subKey);
            }
        });
        function getCount(data, target){
            return data.filter(function(item){
                return item === target;
            }).length;
        }
        return common;
    }
}
document.getElementById('result').innerHTML = getCommon(filter);

JSFiddle: http://jsfiddle.net/LeoAref/bbnbfck7/

相关内容

  • 没有找到相关文章

最新更新