Javascript 计算从新数组和原始数组中添加或删除的内容
问这个问题似乎很愚蠢,但我正在从PHP转移到javascript,使用两个数组有点困难,一个是原始值,另一个是新值 我需要对删除的任何值(运行一些函数)和添加的任何新值采取行动 这是我到目前为止的想法,但似乎不对Javascript 计算从新数组和原始数组中添加或删除的内容,javascript,Javascript,问这个问题似乎很愚蠢,但我正在从PHP转移到javascript,使用两个数组有点困难,一个是原始值,另一个是新值 我需要对删除的任何值(运行一些函数)和添加的任何新值采取行动 这是我到目前为止的想法,但似乎不对 // new values var array1 = [ 'aaaa', 'R26i9vjDHE', 'bbbbb' ]; // original values var array2 = [ 'U8G5AQVsX6', 'R26i9vjDHE', '7IkuofIHEu','aaaa'
// 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工具箱项
建议
我的小提琴让我们来定义“添加”和“删除”的含义:
- 添加:在
数组中,但不在新的
中原始
- 删除:在
中,但不在原始
数组中新
让原始_数组=['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)
。