Удалить некоторые символы в строке JSON.stringify

86
09 февраля 2021, 09:50

Нужно вывести весь объект в виде строки, но в таком формате, чтобы не было скобок которые автоматически создаются.

Вот объект:

crd = {};
crd[2] = {
  x: 100,
  y: 100
}
crd[3] = {
  x: 200,
  y: 200
}

Вывожу:

console.log(JSON.stringify(crd));

Получается:

{"2":{"x":200,"y":200},"3":{"x":100,"y":100}}

Мне нужно чтобы было так:

2 200 200 3 100 100

То есть убрать символы {, }, ", x, y и :, и вывести четкий текст с цифрами. Подскажите, как это сделать? Может быть есть способ лучше?

Answer 1

Нет гарантии в каком порядке будут выведены ключи, то есть x и y будут перепутаны в общем случае

я бы сделал так:

crd = {}; 
 
crd[2] = { 
  y: 100, 
  x: 100 
} 
crd[3] = { 
  x: 200, 
  y: 200 
} 
 
console.log(JSON.stringify(crd)) 
 
console.log(Object.keys(crd).map(function(k) {  
  return k + ' ' + crd[k].x + ' ' + crd[k].y 
}).join(' '))

Answer 2

Неясно, как решать задачу в общем виде, потому что непонятно, например, чем ключи x/y хуже ключей 2/3.
Поэтому, решим в частном виде.
Предположим, что нужные данные - это числа:

const crd = {}; 
 
crd[2] = { 
  x: 100, 
  y: 101 
} 
crd[3] = { 
  x: 200, 
  y: 201 
} 
crd[5] = { 
  y: 301, 
  x: 300 
} 
 
let result = JSON.stringify(crd) 
   .split(/\D+/) // Разбиваем строку на числовые элементы 
   .filter(a=>a) // Отбрасываем пустые элементы(в начале и конце) 
   .join(' ');  // Собираем итоговую строку 
console.log(result) 
 
// Предположение, что структура жёстко задана({key: {x, y}}) 
let res2 = Object.keys(crd) 
  .reduce((res, key) => { 
    res.push(key); 
    ['x', 'y'].forEach(k => res.push(crd[key][k])); 
    return res; 
  }, []) 
  .join(' '); 
console.log(res2);

Answer 3

.match(/\d+/g) — ищет совпадения через регулярное выражение и возвращает массив. \d — одна цифра. А плюсик после него означает "одно или несколько совпадений". Флажок g - (global), позволяет найти все совпадения, а не остановиться на первом найденном.

А из полученного массива собираем строку через .join() - поставив один пробел между элементами.

crd = { 
  2: {x: 100, y: 100}, 
  3: {x: 200, y: 200} 
} 
 
console.log( JSON.stringify(crd).match(/\d+/g).join(' ') );

*Если там могут быть и нецелые числа, тогда \d+\.*\d* — звездочка означает "ноль раз или больше"

READ ALSO
Как сделать добавление элемента в конец с эффектом спойлера?

Как сделать добавление элемента в конец с эффектом спойлера?

Я знаю, что для спойлера есть функцияslideToggle и для добавления в конец

107
Записать значения в cookie

Записать значения в cookie

Вообще не понимаю, в чём ошибка, но cookie вроде как остаётся совершенно пустым

83
Не корректно трансформирует точки в d3

Не корректно трансформирует точки в d3

Почему после увеличения уменьшение зума не корректно пересчитаваются координатыЕсли изначально не зумить, то точки масштабируются корректно,...

90