Какой лучший способ поменять слова в строке - PullRequest
0 голосов
/ 27 апреля 2018

Учитывая следующую строку, как мне поменять местами слова вправо и влево.

т.е. изменить

  • «влево» -> «вправо»
  • «вправо» -> «влево»

let str = JSON.stringify({
  val: 4,
  right: {
    val: 7,
    right: { val: 9, right: null, left: null },
    left: { val: 6, right: null, left: null },
  },
  left: {
    val: 2,
    right: { val: 3, right: null, left: null },
    left: { val: 1, right: null, left: null },
  },
}, null, 2);

str = str.replace((/"left"/g), o => { return "right1" }); 
str = str.replace((/"right"/g), o => { return "left1" });

console.log(); 
console.log(str); 

str = str.replace((/"right1"/g), o => { return "right" });

console.log(); 
console.log(str); 

str = str.replace((/"left1"/g), o => { return "left" });

Я думаю об использовании str.replace ().

Ответы [ 5 ]

0 голосов
/ 28 апреля 2018

Первый параметр функции, который вы можете передать replace - это match.

Вы можете обновить свой код, чтобы использовать чередование, чтобы оно соответствовало либо «левому», либо «правому» и переворачивало значения.

(?:left|right)

let replaced = str.replace(/(?:left|right)/g, o => {
  return o === "left" ? "right" : "left";
});

Обратите внимание, что используя это регулярное выражение, вы также сопоставляете "left" в "alefta". Если вы хотите соответствовать только левому или правому краю, вы можете использовать границу слова \b:

\b(?:left|right)\b

let str = JSON.stringify({
  val: 4,
  right: {
    val: 7,
    right: {
      val: 9,
      right: null,
      left: null
    },
    left: {
      val: 6,
      right: null,
      left: null
    },
  },
  left: {
    val: 2,
    right: {
      val: 3,
      right: null,
      left: null
    },
    left: {
      val: 1,
      right: null,
      left: null
    },
  },
}, null, 2);

let replaced = str.replace(/(?:left|right)/g, o => {
  return o === "left" ? "right" : "left";
});

console.log(replaced);
0 голосов
/ 27 апреля 2018

Не используйте манипуляции со строками, сохраняйте / анализируйте как объект и меняйте свойства:

function swapLeftRight(obj){
  //use object deconstruction to create left and right variables, 
  //and assign them to the opposite name
  let {left:right, right:left} = obj;
  //Assign the new values
  obj.left = left, obj.right = right;
  //Use recursion if the properties are not null
  if(obj.left) swapLeftRight(obj.left);
  if(obj.right) swapLeftRight(obj.right);
}
var data = {
  val: 4,
  right: {
    val: 7,
    right: { val: 9, right: null, left: null },
    left: { val: 6, right: null, left: null },
  },
  left: {
    val: 2,
    right: { val: 3, right: null, left: null },
    left: { val: 1, right: null, left: null },
  }
};
swapLeftRight(data);
console.log(data);
0 голосов
/ 27 апреля 2018

Самый простой способ - использовать заполнитель, а затем заменить заполнитель,

let str = JSON.stringify({
  val: 4,
  right: {
    val: 7,
    right: { val: 9, right: null, left: null },
    left: { val: 6, right: null, left: null },
  },
  left: {
    val: 2,
    right: { val: 3, right: null, left: null },
    left: { val: 1, right: null, left: null },
  },
}, null, 2);

let newStr = str
  .replace('right', '$')
  .replace('left', 'right')
  .replace('$', 'left')

console.log(newStr)

Кроме того, вы можете проанализировать JSON и рекурсивно поменять местами узлы, потому что у вас на руках двоичное дерево.

0 голосов
/ 27 апреля 2018

Не преобразуйте в строку (или, если начинаете со строки, сначала проанализируйте ее). Работайте с самим объектом, и вы можете легко написать рекурсивную функцию для этого:

var original = {
  val: 4,
  right: {
    val: 7,
    right: { val: 9, right: null, left: null },
    left: { val: 6, right: null, left: null },
  },
  left: {
    val: 2,
    right: { val: 3, right: null, left: null },
    left: { val: 1, right: null, left: null },
  },
};

function swapLR(obj) {
    if (!obj || (obj.left == null && obj.right == null)) {
        return obj;
    }
    var tmp = swapLR(obj.left);
    obj.left = swapLR(obj.right);
    obj.right = tmp;
    return obj;
}

console.log(original);
console.log(swapLR(original));

Затем вы можете stringify вернуть его в конец, если вам нужно.

0 голосов
/ 27 апреля 2018

Если вы хотите использовать replace, используйте временное значение:

let str = '{"val":4,"right":{"val":7,"right":{"val":9,"right":null,"left":null},"left":{"val":6,"right":null,"left":null}},"left":{"val":2,"right":{"val":3,"right":null,"left":null},"left":{"val":1,"right":null,"left":null}}}';

function swap() {
  str = str.replace(/right/g, "temp");
  str = str.replace(/left/g, "right");
  str = str.replace(/temp/g, "left");
  console.log(str);
}

swap();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...