Javascript 计算从新数组和原始数组中添加或删除的内容

Javascript 计算从新数组和原始数组中添加或删除的内容,javascript,Javascript,问这个问题似乎很愚蠢,但我正在从PHP转移到javascript,使用两个数组有点困难,一个是原始值,另一个是新值 我需要对删除的任何值(运行一些函数)和添加的任何新值采取行动 这是我到目前为止的想法,但似乎不对 // new values var array1 = [ 'aaaa', 'R26i9vjDHE', 'bbbbb' ]; // original values var array2 = [ 'U8G5AQVsX6', 'R26i9vjDHE', '7IkuofIHEu','aaaa'

问这个问题似乎很愚蠢,但我正在从PHP转移到javascript,使用两个数组有点困难,一个是原始值,另一个是新值

我需要对删除的任何值(运行一些函数)和添加的任何新值采取行动

这是我到目前为止的想法,但似乎不对

// new values
var array1 = [ 'aaaa', 'R26i9vjDHE', 'bbbbb' ];
// original values
var array2 = [ 'U8G5AQVsX6', 'R26i9vjDHE', '7IkuofIHEu','aaaa'];

for (var i = 0; i < array2.length; i++) {
    if(array1.indexOf(array2[i]) != -1) {
    console.log('in new already?');
    console.log(array2[i])
    // do something with new inserted value
  } else {
    console.log('removed items');
    console.log(array2[i])
    // do something with a removed value
  }  
}
//新值
var array1=[‘aaaa’、‘R26i9vjDHE’、‘bbbbb’];
//原值
var array2=['U8G5AQVsX6','R26i9vjDHE','7IkuofIHEu','aaaa'];
对于(变量i=0;i
我习惯于循环中的php in_数组或各种其他php工具箱项

建议


我的小提琴

让我们来定义“添加”和“删除”的含义:

  • 添加:在
    新的
    数组中,但不在
    原始
  • 删除:在
    原始
    中,但不在
    数组中
我们可以使用2 for循环来确定这两种类型的元素:

让原始_数组=['abc','def','ghi'];
让new_数组=['def','jkl','mno'];
for(设i=0;i}
因此,删除的元素将位于
array2
中,而不是
array1
,然后添加的元素将位于
array1
中,而不是
array2
。因此,要检测这两种情况,您需要在两个数组中循环。你可以这样做

var i;
for (i = 0; i < array2.length; i++) {
    if (array1.indexOf(array2[i]) === -1) {
        //item removed from array2
        console.log(array2[i] + ' removed');
    }
}

for (i = 0; i < array1.length; i++) {
    if (array2.indexOf(array1[i]) === -1) {
        //item added to array1
        console.log(array1[i] + ' added');
    }
}
vari;
对于(i=0;i
然后在检测到每个病例时采取适当的措施。

这应该可以做到:

function compute(original, modified, addedCB, removedCB) {
  for (let i of modified) {
    if (!original.includes(i)) {
        // this is a new value
      addedCB(i);
    }
  }
  for (let i of original) {
    if (!modified.includes(i)) {
        // the modified array doesn't include this value
      removedCB(i);
    }
  }
}

使用javascript,您可以在_array
中接近PHP的
。然后,您可以使用它来创建相关阵列:

这比在
for
循环中执行所有操作都要慢一点,但也更简洁明了(IMO):

//新值
var array1=[‘aaaa’、‘R26i9vjDHE’、‘bbbbb’];
//原值
var array2=['U8G5AQVsX6','R26i9vjDHE','7IkuofIHEu','aaaa'];
//在阵列1中,但不在阵列2中
不允许在数组2=array1.filter(item=>!array2.includes(item))中使用数组2=array1.filter(item=>!array2.includes)
//在阵列2中,但不在阵列1中
让不包含在数组1=array2.filter(项=>!array1.includes(项))
//在两个阵列中
让inBoth=array1.filter(项=>array2.includes(项))
log(“不在数组中:”,不在数组中)
log(“不在数组中:”,不在数组中)

log(“在两者中:”,inBoth)
“它似乎不正确”实际上是一个毫无意义的问题陈述。演示在一个数组中缺少逗号。请确保检查浏览器控制台的错误,您可能会在编辑我的评论和小提琴的过程中抓住了我。有趣的是,从过去的编程,我通常循环,但除非该函数有自己的回调。当你说“慢”时,你的意思是仅仅在处理数据时,比通过for循环快速运行要慢吗?我会毫不犹豫地说“慢”,除非你在处理大量数据时注意到瓶颈。它的速度较慢,因为每次调用
filter()
,您都会在数组中循环-因此您的循环次数是循环次数的两倍。而
for
循环在大多数javascript实现中都得到了很好的优化,因此它们在测试中通常会击败其他函数方法——但同样,这只有在影响实际性能时才重要。我真的很喜欢javascript的这种功能风格,但这当然只是我的观点。所以这就是我最终得到的。。减去我想调用的任何函数。。这是小提琴,但是很漂亮的地方。。他们是否对此有所退步,因为这似乎可以通过多种方式完成。似乎接近我最后添加到代码中的方式。我意识到他们在编码方面有很多方法,我只是在思考JS中的一些东西。谢谢你的回复谢谢你的回复,一开始似乎比我需要的多了一点,这个函数如何返回数据..函数不直接返回数据。数据是通过回调返回的。你可以用另外两个函数来调用它。假设您添加了一个
函数(item){console.log(item+'added')}
函数删除(item){console.log(item+'removed')}
,您可以这样调用compute:
compute(array1,array2,added,removed)