使用循环过滤复杂对象的数组

时间:2015-03-27 06:43:08

标签: javascript arrays loops

我有两个复杂的nexted对象数组,我正在寻找使用循环和if语句的限定值,如下所示。当我找到一个合格的对象时,我需要在下一个循环中过滤掉该对象。我正试图用数组做这个,你可以在这里看到,但是在循环的每次迭代过程中它都没有工作。以下版本是我的代码的简化版本。

我想基于if语句更新array2中的值,以便在嵌套循环中不重复这些值。相反,我的emptyArray保持为空,而不是从array2中添加值,因为array2的元素等于数组的元素。

要清楚,现在emptyArray仍为空,永远不会过滤array2。我想在外循环的第二次迭代开始时看到emptyArray收集值2,然后我希望在外循环的第4次迭代开始时看到emptyArray收集值4。

我想从array2中过滤掉这些值中的每一个,因为它们成为emptyArray的一部分,这样它们就不会在外部循环的第6和第8次迭代中引发if语句。我想,当循环结束时,emptyArray = [2,4]和array2 = [6,8,10]。

底线,我需要emptyArray来收集限定值并将它们传递回var array2,以便在循环过程中进行过滤。请记住,这是数组的简化版本,基于下划线的解决方案对我来说非常复杂,或者您无需更多细节即可成功建议。

我的代码:

var array = [1, 2, 3, 4, 1, 2, 3, 4];
var array2 = [2, 4, 6, 8, 10];
var emptyArray = [];
for (i = 0; i < array.length; i++){
     var something = array[i];
     var array2 = _.without(array2, emptyArray);
     for (a = 0; a < array2.length; a++){
         var value = array2[a];
          if(something === value){
              emptyArray.push(value);
              break;
          }
     }
}

2 个答案:

答案 0 :(得分:2)

您的代码存在一些问题,但您认为推送无法正常工作的原因是因为您在循环内覆盖了array2。

push永远不会被调用,因为你的for循环在你var array2 = _.without(array2, emptyArray);

时看到一个空数组2

基本上var array2 = _.without(array2 /* this is empty, you just overrode it in this scope */, emptyArray);将始终导致一个空数组,并且你的for循环将退出,因为length是array2.length === 0从一开始。

此外,您希望使用_.difference代替_.without

&#13;
&#13;
var array = [1, 2, 3, 4, 1, 2, 3, 4];
var array2 = [2, 4, 6, 8, 10];
var emptyArray = [];

for (var i = 0; i < array.length; i++) {
  var something = array[i];
  array2 = _.difference(array2, emptyArray);
  for (var j = 0; j < array2.length; j++) {
    var value = array2[j];
    if (something === value) {
      emptyArray.push(value);
      break;
    }
  }
}

console.log("array2",array2);
console.log("emptyArray", emptyArray);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.js"></script>
&#13;
&#13;
&#13;

array2 [6, 8, 10]
emptyArray [2, 4]

答案 1 :(得分:0)

var array = [1, 2, 3, 4, 1, 2, 3, 4];
var array2 = [2, 4, 6, 8, 10];
var emptyArray = [];

for (var i = 0; i < array.length; i++) {
  var something = array[i];
  for (var j = 0; j < array2.length; j++) {
    var value = array2[j];
    if (something === value) {
      array2 = _.without(array2, value);
      break;
    }
  }
}