向后循环直到找到某个字符(javascript)

时间:2017-01-30 22:07:44

标签: javascript arrays

我的情况是我有一个字符串数组,并且想要将字符附加到数组中位于括号之间的字符串部分。

例如,如果我的数组是:

['Lorem', '(ipsum', 'dolor', 'sit)', 'amet', 'consectetur', 'adipiscing', 'elit']

我想返回类似的内容:

['Lorem', '(ipsum-foo', 'dolor-foo', 'sit-foo)', 'amet', 'consectetur', 'adipiscing', 'elit']

编辑:

大家好, 我为没有添加我的初始代码而道歉。它涉及很多其他东西,但目前看起来像这样:

                // other stuff up above (incl. a backwards loop k)  
                else {  
                    // if it has a certain ending, save to mostRecentTag
                    if (notArray[k].search(/\./) >= 0) { // 
                        var mostRecentTagArray = notArray[k].match(/\.[a-zA-Z,/-]+/); 
                        mostRecentTag = mostRecentTagArray[0]; // mostRecentTag = keyword field code 
                    }
                    // if doesn't meet criteria above, change ending to .af
                    else if (mostRecentTag == "") { // TO DO fix this line: (exercise OR physical.ti) --> "exercise"[ti] OR "physical"[ti]
                        notArray[k] = notArray[k] + ".af"; 
                    }
                    // adds mostRecentTag to the end 
                    else { 
                        notArray[k] = notArray[k] + mostRecentTag; 
                    }

(这是一个更大片段的部分剪辑)

然而,就目前而言,表达如下:

运动或((运动或身体).ti或身体)

将改为:

运动[ti] OR((运动[ti]或物理[ti])或物理)

我希望它评估为:

运动OR((运动[ti]或物理[ti])或物理运动

我希望这一切都有意义,我为部分和令人困惑的代码道歉。

4 个答案:

答案 0 :(得分:3)

有很多方法可以解决此类问题,但一般来说,您希望隔离目标子字符串,修改它,然后用修改后的值替换原始值。实现此目的的一种方法是使用正则表达式来匹配子字符串。

JSFiddle:https://jsfiddle.net/agqb8ycd/

var arr = ['Lorem', '(ipsum, dolor, sit)', 'amet', 'consectetur', 'adipiscing', 'elit'];
var tester = /\((.*)?\)/; // Find strings which contain parens () that contain characters i.e., (adsf)

// Operate on the array
arr.forEach(function (content, i) {
  var matchedContent = content.match(tester);

    // Noop strings that don't match the tester
  if (!matchedContent) {
    return;
  }

  // Now we'll need to operate on those substrings within the parens individually. In this case they are separated by commas, so the most simple way is to break the string into an array of strings and mutate them.
  var substrings = matchedContent[1].split(',');

  // Mutate the substrings
  substrings = substrings.map(function (substring) {
    return substring + '-foo';
  });

  // Since we matched on the group within the regular expression, we will have to restore the parens lost by the matcher
  var mutatedContent = '(' + substrings.join(', ') + ')';

  // Overwrite the original value in the array
  arr[i] = mutatedContent;
});

答案 1 :(得分:0)

这个涉及使用一些正则表达式,我认为它可能比其他一些选项更具可读性。

var data = ['Lorem', '(ipsum, dolor, sit)', 'amet', 'consectetur', 'adipiscing', 'elit'];

var updated = data.map((item) => { 
    var res = /\((.*)\)/.exec(item); 
    if(!res) return item;
    var modified = res[1].split(',').map((word) => { return word + '-foo'; });
    return '(' + modified.join(',') + ')';
});


console.log(updated);

工作小提琴: https://jsfiddle.net/pwkf9L9m/

答案 2 :(得分:0)

在这种情况下,js不知道('ipsum','dolor','sit')作为字符串。如果您设置此代码:

.on("mouseover")

您将只看到“坐在”警报(最后一个)。因此最好将所有数组作为一个字符串:

var arr = ['Lorem', ('ipsum', 'dolor', 'sit'), 'amet', 'consectetur', 'adipiscing', 'elit'];
alert(arr[1]);

var str = ['Lorem, (ipsum, dolor, sit), amet, consectetur, adipiscing, elit'];

答案 3 :(得分:0)

如果数组项中永远不会有,,那么使用连接很容易从数组中生成一个字符串 使用replace在字符串中添加-foo 并将tring再次拆分为数组

var arr = ['Lorem', '(ipsum', 'dolor', 'sit)', 'amet', 'consectetur', 'adipiscing', 'elit'];
var result = arr
    .join(',')
    .replace(/(\(.*)\)/g, '$1-foo)')
    .split(',');

如果另一方面,您可能在项目中有,,则需要额外的步骤来隐藏" , - 我使用encodeURIComponent / decodeURIComponent

var arr = ['Lorem', '(ipsum', 'dol,or', 'sit)', 'amet', 'consectetur', 'adipiscing', 'elit'];
var result = arr.map(function(item) {
        return encodeURIComponent(item);
    })
    .join(',')
    .replace(/(\(.*)\)/g, '$1-foo)')
    .split(',')
    .map(function(item) {
        return decodeURIComponent(item);
    });