计算新阵列和原始阵列中添加或删除的内容

时间:2018-08-08 22:40:25

标签: javascript

问这个问题似乎很愚蠢,但是我从PHP转移到javascript有点麻烦,用2个数组(原始值和另一个新值)很难。

我需要对所有删除的值(运行某些功能)和添加的所有 new 值采取行动。

到目前为止,这是我想到的,但这似乎并不正确。

// 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
  }  
}

我习惯于循环使用php的in_array或其他各种php工具箱项目。

建议?

我的小提琴https://jsfiddle.net/xv8ah2yf/8/

4 个答案:

答案 0 :(得分:0)

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

  • new数组中添加:但在original不是
  • 已删除:在original中,但在new数组中不是

我们可以使用2个for循环来确定这两种类型的元素:

let original_array = ['abc', 'def', 'ghi'];
let new_array      = ['def', 'jkl', 'mno'];
for (let i = 0; i < new_array.length; i++){
    if (!original_array.includes(new_array[i])){
        console.log(new_array[i], 'has been added');
        //further actions...
    }
}
for (let i = 0; i < original_array.length; i++){
    if (!new_array.includes(original_array[i])){
        console.log(original_array[i], 'has been removed');
        //further actions...
    }
}

答案 1 :(得分:0)

因此,已删除的元素将在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');
    }
}

然后在检测到每种情况时采取适当的措施。

答案 2 :(得分:0)

这应该做到:

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);
    }
  }
}

答案 3 :(得分:0)

您可以使用JavaScript的array.includes来接近PHP的in_array。您可以使用它来filter有问题的数组:

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

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

// in array1 but not in array2
let not_in_array2 = array1.filter(item => !array2.includes(item))

// in array2 but not in array1
let not_in_array1 = array2.filter(item => !array1.includes(item))

// in both arrays
let inBoth = array1.filter(item => array2.includes(item))

console.log("Not in array1:", not_in_array1)
console.log("Not in array2:", not_in_array2)
console.log("In both:", inBoth)

您可以在其中forEach()map()查看结果并应用所需的任何功能。