【问题标题】:javascript array object in array object数组对象中的javascript数组对象
【发布时间】:2014-03-20 17:53:34
【问题描述】:

我无法理解这个。有人可以向我展示一个执行此操作的函数示例。我需要一个 javascript 函数来执行此操作

如果所有 array1s 值都匹配 array2s 值返回 true 如果没有/部分匹配返回 array1s 值不匹配

array1 = [{name:'joe'},{name:'jill'},{name:'bob'}]
array2 = [{name:'joe'},{name:'jason'},{name:'sam'}]

match(array1, array2) 

//if fails returns [{name:'jill'}, {name:'bob'}]
//if success returns true

请帮助我的大脑受伤XD

谢谢

编辑:很抱歉在对象具有其他一些不同的属性之前没有这么说。所以给定的对象可能看起来像

array1x = [{name:'joe', id:33},{name:'jill'},{name:'bob'}]
array2x = [{name:'joe', state:'fl'},{name:'jill'},{name:'bob'}]

我只需要匹配对象中的 name 属性

【问题讨论】:

  • 您要按位置匹配吗?例如,如果 array2 在位置 4 中有 {name:'jill'},那么匹配是否会失败,因为它在 array1 的位置 1 中?或者它在array2 某处会成功吗?
  • 不,我不希望职位成为一个因素。顺便说一句,感谢您在下面的提交。

标签: javascript jquery loops object nested-loops


【解决方案1】:

Array.prototype.filter() + Array.prototype.some() =

function match(arr1, arr2) {
    var notFound = arr1.filter(function(obj1) {
        return !arr2.some(function(obj2) {
            return obj2.name == obj1.name;
        });
    });

    return !notFound.length || notFound;
}

fiddle

【讨论】:

  • 该技术的一个 abstraction 保留了您的良好算法,但将两个对象是否匹配的测试提升到了回调函数中。
  • 完美运行!谢谢 XD 和 @ScottSauyet 使它模块化/可重用的好方法:-)
  • 我认为 return !array2.some(function(obj2) { 应该是 return !arr2.some(function(obj2) { 对吧?
  • @codenamejames 你是对的!我已经修正了错字:)
  • 我会在 match 函数中添加另一个参数,其中包含要检查的属性名称以使其更有用: function match(arr1, arr2, id) { ... return obj2[id ] == obj1[id];
【解决方案2】:

以下是此类功能的一个非常基本的示例:

function match(array1, array2) {
    var len = Math.max(array1.length, array2.length),
        result = [];

    for (var i = 0; i < len; i++) {
        if (JSON.stringify(array1[i]) !== JSON.stringify(array2[i])) {
            result.push(array1[i]);
        }
    }

    return result.length > 0 ? result : true;
}

它会在考虑索引的情况下逐一比较序列化的元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2016-04-22
    • 1970-01-01
    相关资源
    最近更新 更多