【问题标题】:Check if array of object value exist in another array but different length检查对象值数组是否存在于另一个数组中但长度不同
【发布时间】:2017-03-12 18:32:22
【问题描述】:

我有 2 个对象数组,只想检查 b 是否存在于 a 中,如果存在则添加一个新属性。但 b 的长度是动态的。我会得到 b 未定义的错误。

var a = [{name:'john'},{name:'james'},{name:'jordan'},{name:'joe'}];
var b = [{name:'john'},{name:'joe'}];

var exist = 0;
var c = _.map(a,function(result,i){
    exist = b[i].name.indexOf(a.name) > -1 ? exist = 1 : exist = 0;

    return _.extend({},c,{'exist':exist});
});

有什么线索吗?

【问题讨论】:

    标签: javascript jquery lodash


    【解决方案1】:

    我会遍历 b 个对象,并为每个对象检查它们是否存在于 A 中,如下例所示。

        var a = [ { _id: '5815adb4badf3f311a2cd25b', username: 'david&jane' },
        { _id: '5815e40e136c8e33b65b3478', username: 'david+jane' } ];
        var b = [ { username: 'david&jane' },
                  { username: 'david<3jane' },
                  { username: 'david+jane' },
                  { username: 'davidjane' } 
        ]
        var c = [];
    
        b.forEach(function(user) {
          var exists = false;
          for (let i=0; i<a.length && !exists; i++){
              exists = a[i].username === user.username ;
          }
          
          c.push(Object.assign({},user,{exists}));
        });
    
        console.log(c);

    【讨论】:

    • 什么是 Object.assign,ES6 之前从未见过?
    • 是的,假设表现得像你的_.extend({},c,{'exist':exist});
    • 假设我的 a 有额外的 id 字段,那么我不能应用你的解决方案,介意看看为什么? pastebin.com/1PTPZpkc
    • 不使用Object.assign,可以使用lodash吗?在旧浏览器上使用 ES6 风险太大。
    • @ThianKianPhin 我用具有 id 属性的对象更新了示例,但看不到问题。是的,我不明白为什么你不能使用 loadash
    【解决方案2】:

    您可以使用Array.every 来检查b 中的每个对象是否也在a 中,并且在回调中您可以使用Array.some 来检查a 中的键和值

    var a = [{name:'john'},{name:'james'},{name:'jordan'},{name:'joe'}];
    var b = [{name:'john'},{name:'joe'}];
    
    var exist = b.every( (o) => {
        let k = Object.keys(o)[0];
        return a.some( p => k in p && p[k] === o[k]);
    });
    
    console.log(exist)

    如果你想添加属性,你也可以这样做

    var a = [{name:'john'},{name:'james'},{name:'jordan'},{name:'joe'}];
    var b = [{name:'john'},{name:'joe'}];
    
    var c = b.map( (o) => {
        let k = Object.keys(o)[0];
        return o.exist = a.some( p => k in p && p[k] === o[k]), o;
    });
    
    console.log(c);

    【讨论】:

    • 嘿,第一个例子应该返回true两次不是吗?
    • 嗯,不,我只是根据b 中的所有对象是否都在a 中,使第一个示例返回真或假。
    • 知道了。谢谢!
    【解决方案3】:

    第一个 stringify a 数组。循环通过b 并创建一个动态正则表达式来测试a,如果测试匹配做你的事情。

    希望这会有所帮助!

    var a = [{name:'john'},{name:'james'},{name:'jordan'},{name:'joe'}];
    var b = [{name:'john'},{name:'joe'}, {name:'hello'}];
    
    var strA = JSON.stringify(a)
    
    var result = b.map((el) => {
      var elStr = JSON.stringify(el)
      var regex = new RegExp(elStr, 'g')
      if(regex.test(strA))
         return Object.assign({}, el, {exist: 1})
      return Object.assign({}, el, {exist: 0})
    })
    
    console.log(result)

    【讨论】:

    • 我没有投反对票,但这对我来说似乎太复杂了。
    • 这是最简单的一个循环的答案。
    • 你只需要遍历b。对于b 中的每个元素,另一个答案将通过a 循环,这确实很昂贵。
    猜你喜欢
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 2020-06-09
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多