我正在为Mixitup构建一个过滤方法,我需要能够正确过滤x选定的参数。(这里的插件并不重要,这是我如何得到我正确的结束对象)
我目前有一个对象,对于每个唯一搜索都发送一个唯一键,以及它的匹配对象(通过过滤器方法获得)到我的过滤函数。
这就是我迷路的地方。
我需要能够循环遍历我的对象,它的关联键=>值(对象),并且只取出每个对象中存在的对象。
例如(我用jQuery对象代替数字)
var filter = {
x : {1,3,5,6},
y : {1,4,7,8},
z : {1,9}
}
根据上面的例子,唯一返回的对象将是- 1(因为它是所有三个键中唯一存在的对象)。
任何帮助都将非常感激!
Array.reduce
和Array.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/