访问数组中字符串的索引并获取总和

时间:2016-01-04 21:42:54

标签: javascript arrays string indexing indexof

好的,我试图访问此数组内部字符串中的每个单独的数字。

var array = ['818-625-9945','999-992-1313','888-222-2222','999-123-1245'];
var str = "";
for (i=0; i<array.length; i++) {
  str = array[i];
}

问题是这是输出:'999-992-1313'

而不是第一个元素数组[0]:'818-625-9945'

当我尝试使用嵌套的for循环来遍历字符串中的每个元素时,我无法说明这些元素。

var array = ['818-625-9945','999-992-1313','888-222-2222','999-123-1245'];
for (i=0; i<array.length; i++) {
  for (j=0; j<array[i].length; j++) {
    console.log(array[i][j]);
  } 
}

我不知道如何访问字符串数组[i]中的每个单独的数字。我想找到一种方法来制作一个计数器,这样如果我遇到数字'8',我会在总分上加8,所以我可以得到每个单独的字符串元素的总和,看看哪个数字的总和最高。

var array = ['818-625-9945','999-992-1313','888-222-2222','999-123-1245'];
for (i=0; i<array.length; i++) {
  for (j=0; j<array[i].length; j++) {
    if (array[i](j).indexOf('8') !== -1) {
      // add one to total score
      // then find a way to increase the index to the next index (might need help here also please)
    }
  }
}

2 个答案:

答案 0 :(得分:1)

Mabe这适合你。它使用了Array.prototype.reduce()Array.prototype.map()String.prototype.split()

此提议通过给定数组进行识别并拆分每个字符串,然后使用'8'检查来过滤得到的数组。返回的数组作为计数并添加到前一次迭代reduce的返回值 - 并返回。

var array = ['818-625-9945', '999-992-1313', '888-222-2222', '999-123-1245'],
    score = array.reduce(function (r, a) {
        return r + a.split('').filter(function (b) { return b === '8'; }).length;
    }, 0);

document.write('Score: ' + score);

建议的方法,计算每个字符串上的所有'8'

var array = ['818-625-9945', '999-992-1313', '888-222-2222', '999-123-1245'],
    score = array.map(function (a) {
        return a.split('').filter(function (b) { return b === '8'; }).length;
    });

document.write('Score: ' + score);

答案 1 :(得分:0)

实际上重读你的问题让我更清楚你想要什么。您只需要计算并检索每个字符串的8个数,以及数组中的哪个索引符合此最大值8。此函数检索在数组中找到值的索引,找到8的次数以及此结果的字符串值。 (或者在你给出一个空数组的情况下返回一个空对象)

您可以轻松地执行以下操作:

'use strict';
var array = ['818-625-9945', '999-992-1313', '888-222-2222', '999-123-1245'];

function getHighestEightCountFromArray(arr) {
  var max = 0,
    result = {};
  if (arr && arr.forEach) {
    arr.forEach(function(value, idx) {
      var cnt = value.split('8').length;
      if (max < cnt) {
        // found more nr 8 in this section (nl: cnt - 1)
        max = cnt;
        // store the value that gave this max
        result = {
          count: cnt - 1,
          value: value,
          index: idx
        };
      }
    });
  }
  return result;
}

console.log(getHighestEightCountFromArray(array));

这里唯一的一点是,当找到相同数量的计数时,它仍将使用找到的第一个计数,在这里你可以决定哪个“最大” 应该是首选(数组中的第一个,或数组中的最新/最新的一个)

<强> OLD

我不确定你缺少哪些款项,但你可以通过以下方式完成。

我首先遍历数组中的所有项,然后使用String.prototype.split函数将单个数组项拆分为一个数组,然后包含['818','625','9945' ]。然后对于每个值,您可以重复相同的样式,nl:拆分您正在接收的值,然后遍历所有单个值。然后使用Number.parseInt转换为数字,然后将所有值一起计算。

有更短的方式,但这是你如何做到这一点

'use strict';

var array = ['818-625-9945','999-992-1313','888-222-2222','999-123-1245'],
    sumPerIndex = [],
    totalSum = 0;

array.forEach(function(item, idx) {
  var values = item.split('-'), subArray = [], itemSum = 0;
  values.forEach(function(value) {
    var singleItems = value.split(''),
        charSum = 0;
    singleItems.forEach(function(char) {
      charSum += parseInt(char);
    });
    itemSum += charSum;
    subArray.push(charSum);
    console.log('Sum for chars of ' + value + ' = ' + charSum);
  });
  sumPerIndex.push(subArray);
  totalSum += itemSum;
  console.log('Sum for single values of ' + item + ' = ' + itemSum);
});
console.log('Total sum of all elements: ' + totalSum);
console.log('All invidual sums', sumPerIndex);