另一个for循环Javascript

时间:2018-11-08 15:55:35

标签: javascript for-loop

我在经历这两个for循环时遇到问题,我需要从循环内的第一个数组中获取相同的元素,但是值是重复的。我知道根据第二个数组的数据重复它们。

我试图进行比较,但无法获得想要的结果。

var array = [
{
  grouper: 1
},
{
  grouper: 2
},
{
  grouper: 3
},
{
  grouper: 4
},
];


var array2 = [
{
  value: 1,
  grouper: 1,
  status: 100
},
{
  value: 2,
  grouper: 2,
  status: 100
},
{
  value: 3,
  grouper: 3,
  status: 100
}
];


for(var i = 0; i<array.length; i++){
   for(var j = 0; j<array2.length; j++){
      if(array2[j].grouper == array[i].grouper){
        console.log(array[i].grouper+'-'+array2[j].value);
      }
   }
}

这是我想要的结果,我需要第一个数组中的所有石斑鱼和第二个数组中的值:

1-1
2-2
3-3
4-

石斑鱼4没有价值,但我需要证明它。

我需要第二个数组,因为我要与第二个数组中的数据进行比较

我不知道我做错了什么。我希望你能帮助我。

3 个答案:

答案 0 :(得分:0)

首先,通过您提供的示例,我相信您想回来:

1,2,3

array2内没有第4个对象,因此您的条件(array2[j].grouper == array[i].grouper将永远不会为true。

这里的问题是,是否始终在比较相同的索引?在此示例中,您正在将array [0]与array2 [0]进行比较,以查看array中的分组者是否等于array2中的分组者……就是这样?

在这种情况下,您只需执行一个循环:

for (var i = 0; i < array.length; i++) {
      if (array[i].grouper == array2[i].grouper) {
        console.log(array[i].grouper+'-'+array2[j].value);
      }
}

答案 1 :(得分:0)

您可以简单地跟踪是否存在匹配项(变量shown),如果没有匹配项,则显示“一半”行:

var array = [{grouper: 1},{grouper: 2},{grouper: 3},{grouper: 4},];

var array2 = [
{value: 1, grouper: 1, status: 100},
{value: 2, grouper: 2, status: 100},
{value: 3, grouper: 3, status: 100}
];

for(var i = 0; i<array.length; i++){
   var shown=false;
   for(var j = 0; j<array2.length; j++){
      if(array2[j].grouper == array[i].grouper){
        console.log(array[i].grouper+'-'+array2[j].value);
        shown=true;
      }
   }
   if(!shown){
     console.log(array[i].grouper+"-");
   }
}

答案 2 :(得分:0)

@FabianSierra ...与您提供的示例一样,您只需要在最内部的循环中处理未实现的if子句/条件。

另外,更通用的方法可能会考虑更改字段名称(键)。因此,基于函数和基于Array.reduce / Array.find的方法可提供更好的代码重用。然后,一个示例实现可能看起来类似于...

var array = [{ // in order.
  grouper: 1
}, {
  grouper: 2
}, {
  grouper: 3
}, {
  grouper: 4
}];

var array2 = [{ // not in the order similar to `array`.
  value: 22,
  grouper: 2,
  status: 200
}, {
  value: 33,
  grouper: 3,
  status: 300
}, {
  value: 11,
  grouper: 1,
  status: 100
}];


function collectRelatedItemValuesByKeys(collector, item) {
  var sourceKey = collector.sourceKey;
  var targetKey = collector.targetKey;
  var targetList = collector.targetList;
  var resultList = collector.result;

  var sourceValue = item[sourceKey];
  var targetValue;
  var relatedItem = targetList.find(function (targetItem) {

    return (targetItem[sourceKey] === sourceValue);
  });
  if (typeof relatedItem !== 'undefined') {

    targetValue = relatedItem[targetKey];

  } else if (typeof targetValue === 'undefined') {

    targetValue = ''; // `relatedItem` does not exist.
  }
  resultList.push([sourceValue, targetValue].join('-'));
  
  return collector;
}


var resultList = array.reduce(collectRelatedItemValuesByKeys, {

  sourceKey: 'grouper',
  targetKey: 'value',
  targetList: array2,
  result: []

}).result;

console.log('resultList : ', resultList);

resultList = array.reduce(collectRelatedItemValuesByKeys, {

  sourceKey: 'grouper',
  targetKey: 'status',
  targetList: array2,
  result: []

}).result;

console.log('resultList : ', resultList);
.as-console-wrapper { max-height: 100%!important; top: 0; }