JS怎么从一个对象条件匹配另一个对象

比如

var aa={a:1,b:1}
var bb=[{a:1,b:1,c:1},{a:2,b:2,,c:1},{a:3,b:3,c:1}]

结果

console.log({a:1,b:1,c:1})

怎么通过aa给的条件查找到bb里的第一个

阅读 4.8k
4 个回答
var aKeys = Object.keys(aa)
bb.find(b => aKeys.every(k => aa[k] === b[k]))

用 Lodash 就比较简洁了

_.find(bb, aa)
var aa={a:1,b:1}
var bb=[{a:1,b:1,c:1},{a:2,b:2,c:1},{a:3,b:3,c:1}]
function search(data, condition){
    var matchIndexs = [];
    for(var i=0; i<data.length; i++){
        var item = data[i];
        var isMatch = true;
        for(var key in condition){
            if(condition[key] !== item[key]){
                isMatch = false;
                break;
            }
        }
        if(isMatch){
            matchIndexs.push(i);
        }
    }
    return matchIndexs;
}

var result = search(bb,aa);
console.log(result);

demo on jsbin

可以用ES5的Array.prototype.filter()方法,遍历给定数组,筛选出符合条件的元素

var aa={a:1,b:1}
var bb=[{a:1,b:1,c:1},{a:2,b:2,c:1},{a:3,b:3,c:1}]

// callback
// 用来测试数组的每个元素的函数。调用时使用参数 (element, index, array)。
// 返回true表示保留该元素(通过测试),false则不保留。
function callback(element) {
    return element.a === aa.a && element.b === aa.b
}

//ES5 Array.prototype.filter()方法,遍历给定数组,筛选出符合条件的元素
bb.filter(callback)

不需要引入库,也不需要重新写,原生自带

MDN - Array.prototype.filter方法

//获取aa的key  
var _key= Object.keys(aa)  //[a,b]

bb.filter(item=>_key.every(k=>aa[k]===item[k]))
//这里分几步简单说明一下
//bb.filter遍历bb的每一项(item),如果_key.every(k=>aa[k]===item[k])返回true就添加,否则过滤掉。最后返回一个数组
//_key.every(k=>aa[k]===item[k])   这里是遍历_key,利用every方法判断,aa给出的条件(属性)和bb的当前遍历的项(item)的这些属性,是不是都相等。都相等返回true,否则返回false。
//最后bb.filter  根据上一步返回结果进行过滤  如果_key.every(k=>aa[k]===item[k])返回true就添加,否则过滤掉。最后返回一个数组

运行结果
clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题