【问题标题】:push a array object into another array object if the value not exists如果值不存在,则将数组对象推入另一个数组对象
【发布时间】:2022-03-27 04:07:45
【问题描述】:

如果值不存在,需要将数组对象(arr1) 值推入另一个数组对象(arr2)。现有值不会推入另一个数组。

var arr1 = [{
    name: 'fred'
}, {
    name: 'bill'
}, {
    name: 'ted'
}, {
    name: 'james'
}];

var arr2 = [{
    name: 'spil'
}, {
    name: 'fred'
}, {
    name: 'bill'
},{
    name: 'paul'
}, {
    name: 'stone'
}];

function add(name) {
    var found = arr1.some(function (el) {
      return el.name === name;
    });
    if (!found) {
        arr1.push(arr2);
    }
    return arr2;
}

Fiddle

【问题讨论】:

  • 查看this.LiraNuna 的回答会对您有所帮助。
  • 你的函数add应该做什么?
  • 您正在谈论将值推入arr2,但您的代码却相反(或试图这样做)。鉴于您的 add() 函数似乎将字符串作为输入,如果该值当前不在两个数组中,应该发生什么 (a)? (b) 如果目前只有arr1? (c) 如果目前只有arr2? (d) 如果它已经在两个数组中?

标签: javascript arrays object


【解决方案1】:

如果名称属性已经在arr1 中,您可以使用哈希表进行查找。如果不推送实际项目到arr1

var arr1 = [{ name: 'fred' }, { name: 'bill' }, { name: 'ted' }, { name: 'james' }],
    arr2 = [{ name: 'toString' }, { name: 'spil' }, { name: 'fred' }, { name: 'bill' }, { name: 'paul' }, { name: 'stone' }],
    hash = Object.create(null);

arr1.forEach(function (a) {
    hash[a.name] = true;
});
arr2.forEach(function (a) {
    hash[a.name] || arr1.push(a);
});

console.log(arr1);

PS

只是为了弄清楚,为什么Object.create(null),一个真正的空对象作为哈希而不是{},一个空对象。关注{ name: 'toString' } 项目。在第一部分,项目被插入,在第二部分没有,因为hash 有一个名为toString 的属性。

var arr1 = [{ name: 'fred' }, { name: 'bill' }, { name: 'ted' }, { name: 'james' }],
    arr2 = [{ name: 'toString' }, { name: 'spil' }, { name: 'fred' }, { name: 'bill' }, { name: 'paul' }, { name: 'stone' }],
    hash = {}; // now an object

arr1.forEach(function (a) {
    hash[a.name] = true;
});
arr2.forEach(function (a) {
    hash[a.name] || arr1.push(a);
});

console.log(arr1);

【讨论】:

    【解决方案2】:

    如果你只附加一个变量,那么 push() 就可以了。如果需要追加另一个数组,请使用 concat(): var ar1 = [1, 2, 3]; var ar2 = [4, 5, 6];

    var ar3 = ar1.concat(ar2);
    
    alert(ar1);
    alert(ar2);
    alert(ar3);
    

    会吐出来:

    "1,2,3"
    "4,5,6"
    "1,2,3,4,5,6"
    

    除非重新分配,否则 concat 不会影响 ar1 和 ar2,例如:

    ar1 = ar1.concat(ar2);
    alert(ar1);
    

    将显示:

    "1,2,3,4,5,6"
    

    【讨论】:

      【解决方案3】:

      您好,检查一下,您可以将第一个数组推送到其他数组,稍后可以使用下划线唯一性来仅返回唯一对象

         var arr1 = [{
          name: 'fred'
      }, {
          name: 'bill'
      }, {
          name: 'ted'
      }, {
          name: 'james'
      }];
      
      var arr2 = [{
          name: 'spil'
      }, {
          name: 'fred'
      }, {
          name: 'bill'
      }, {
          name: 'paul'
      }, {
          name: 'stone'
      }];
      
      arr1.push(arr2);
      arr1 = _.uniq(arr1, false, function(p) {
          return p.name;
      });
      

      【讨论】:

      • 对于不知道Underscore是什么的JS初学者呢? (此外,您将整个 arr2 数组作为 arr1 的单个元素推送 - 我知道 OP 的代码是这样做的,但我认为这不是他们想要的。)
      • 你又开始了@nnnnnn
      【解决方案4】:

      使用indexOf 获取不存在的名称。首先将您的arr1 名称存储为数组!!!

      var hasName = arr1.map(function(obj) { return obj.name; });
      arr2.filter(function(v,i) { if(hasName.indexOf(v.name) == -1) arr1.push(v); });      
      console.log(arr1);
      

      【讨论】:

        【解决方案5】:

        如果你有幸使用 ECMAScript 6,那么你可以创建这个可爱的块

        var arr1 = [{
            name: 'fred'
        }, {
            name: 'bill'
        }, {
            name: 'ted'
        }, {
            name: 'james'
        }];
        
        var arr2 = [{
            name: 'spil'
        }, {
            name: 'fred'
        }, {
            name: 'bill'
        },{
            name: 'paul'
        }, {
            name: 'stone'
        }];
        
        arr2.forEach(arr2Item => arr1.find(({ name }) => name === arr2Item.name) || arr1.push(arr2Item));
        
        console.log(arr1);

        鉴于存在大量递归,您可能希望以不同的格式存储数据,以便更轻松地进行比较。您可以使用对象哈希或ES6 Map 让您的生活更轻松。还可以节省几个周期?

        【讨论】:

          猜你喜欢
          • 2020-02-08
          • 2016-05-30
          • 2019-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-13
          相关资源
          最近更新 更多