【问题标题】:Javascript : Increment name if existJavascript:如果存在则增加名称
【发布时间】:2019-08-07 20:52:58
【问题描述】:

我想在数组中推送一个名称,该名称将是默认名称。
如果名称已经存在,我需要在推送之前向其添加一个整数,例如如果实例存在则递增。

如果不存在它应该创建一个实例,将在整个过程中做同样的事情但它应该递增。

var arr = ['team banana', 'team melon', 'team melon 2', 'team orange'] 
var name = 'team apple'; // this is default team name
var xarr = [];

if(arr.length){
    // store the all instances of 'team apple'
    for(var c = 0; c <= arr.length; c++){
        if(arr[c] !== undefined){
            if(arr[c].indexOf('team apple')  > -1){
                xarr.push(arr[c].replace(/['0-9']/g,''))
            }
        }
    }
    // start the iterration
    for (var k=0; k<=arr.length; k++){
        // if existing
        if(arr[k] !== undefined){
            if(name === arr[k]) {
                arr.push(name+' ' + ( xarr.length))
            }else{
                // if not existing creat an instance of 'team apple'
                // arr.push(name) <--- this cause the browser to crash
            }
        }
    }
    xarr = []
}else{
    arr.push(name )
}

console.log(arr)

我期待的结果是这样的:

['team banana', 'team melon', 'team melon 2', 'team orange','team apple','team apple 1', 'team apple 2' ...]

代码块已经在工作了,只是如果数组中没有'team apple'的实例,它会开始崩溃

如果数组看起来像这样,一切正常:

['team banana', 'team melon', 'team melon 2', 'team orange','team apple']

但如果它看起来像这样:

['team banana', 'team melon', 'team melon 2', 'team orange']

浏览器开始崩溃。

这是导致它的代码部分,我不知道。

if(name === arr[k]) {
    arr.push(name+' ' + (xarr.length))
}else{
    // if not existing creat an instance of 'team apple'
    // arr.push(name) <--- this cause the browser to crash
}

我什至不确定这是否是正确的实现,我真正想要的是一个递增的名称。任何建议都会有很大帮助。我也仅限于 ES5。

提前致谢

【问题讨论】:

  • 你确定推送会导致浏览器崩溃吗?
  • @JackBashford 是的,它崩溃了,最终我关闭了浏览器并显示错误消息“在可能的内存不足崩溃之前暂停”

标签: javascript jquery arrays ecmascript-5


【解决方案1】:

使用过滤器并将结果长度作为后缀会容易得多。你的代码中有很多循环,只有一个是需要的

const arr = ['team banana', 'team melon', 'team melon 2', 'team orange']
const name = 'team apple';

function addToArr(arr, name) {
  const postfix = arr.filter(e => e.replace(/\s\d+$/, '') === name).length || '';
  arr.push(`${name} ${postfix}`.trim());
  return arr;
}

console.log(addToArr(arr, name));
console.log(addToArr(arr, name));
console.log(addToArr(arr, name));

ES 5 版本

var arr = ['team banana', 'team melon', 'team melon 2', 'team orange']
var name = 'team apple';

function addToArr(arr, name) {
  var postfix = arr.filter(function(e) { return e.replace(/\s\d+$/, '') === name}).length || '';
  arr.push((name + ' ' + postfix).trim());
  return arr;
}

console.log(addToArr(arr, name));
console.log(addToArr(arr, name));
console.log(addToArr(arr, name));

【讨论】:

    【解决方案2】:

    您只需要确定数组中存在多少要添加的团队实例。为此,您可以使用Array.filter (see MDN) 或您自己的过滤方法。比如:

    (() => {
      let arr = ['team banana', 'team melon', 'team melon 2', 'team orange'];
      const teamApple = "team apple";
    
      addTeam(teamApple, arr);
      addTeam(teamApple, arr);
      addTeam(teamApple, arr);
      addTeam(teamApple, arr);
      addTeamAlternative(teamApple, arr);
      console.log(arr);
      
      // will it work for an empty array?
      let newArr = [];
      addTeamAlternative(teamApple, newArr);
      addTeamAlternative(teamApple, newArr);
      addTeam("team kiwifruit", newArr);
      addTeam("team kiwifruit", newArr);
      console.log(newArr);
      
      // Array.filter and ES20xx
      function addTeam(team, someArr) {
        const nExisting = someArr.filter(teamFromArray => teamFromArray.startsWith(team)).length;
        someArr.push(team + (nExisting == 0 ? "" : ` ${nExisting + 1}`));
        return someArr;
      }
      
      // Your own method (a more 'classic' alternative)
      function addTeamAlternative(team, someArr) {
        var arrSearch = someArr.slice(0);
        var value = arrSearch.shift();
        var nExisting = 1;
        while(value) {
          nExisting += +RegExp("^" + team).test(value);
          value = arrSearch.shift();
        }
        someArr.push(team + (nExisting > 1 ? (" " + nExisting) : ""));
        return someArr;
      }
    })()

    【讨论】:

      猜你喜欢
      • 2020-02-04
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 2014-05-18
      相关资源
      最近更新 更多