Как разобрать истинные и ложные строки в массиве, чтобы они стали логическими значениями - PullRequest
0 голосов
/ 23 октября 2018

Как мне разобрать строки true и false в массиве, чтобы они стали логическими в Javascript?

Например,

из:

{"id":1,"dashboardId":1,"w":2,"h":2,"x":0,"y":0,"i":"n0","minW":1,"minH":1,"maxH":1000,"moved":"false","static":"false","widget":"Photo"}

to:

{"id":1,"dashboardId":1,"w":2,"h":2,"x":0,"y":0,"i":"n0","minW":1,"minH":1,"maxH":1000,"moved":false,"static":false,"widget":"Photo"}

Значения от moved и static должны быть логическими, но они отображаются в виде строки.Есть ли способ изменить только эти значения?

Это функция, из которой я выбираю массивы:

loadData = () => {

    let dashboardId = 1;

    return axios
        .get('api/dashboards/' + dashboardId)
            .then(result => {

                //@TODO Parse true and false strings to become booleans

                console.log(result);
                this.setState({
                    items: result.data,
                    selectedOption: '',
                    newCounter: originalLayouts.length
                });
            })
            .catch(error => {
                console.log(JSON.stringify(this.state.items));
                console.error('error: ', error);
            })
};

Ответы [ 5 ]

0 голосов
/ 23 октября 2018

Вы можете выполнить итерацию объекта и проверить его значение строго для "false" или "true" и проанализировать их вручную для логического значения.

Например

function mapObjectValues (obj = {}) {
    for (var key in obj) {
      var val = obj[ key ];
      
      if (val === "false") {
          obj[ key ] = false;
      }
      else if (val === "true") {
          obj[ key ] = true;
      }
    }
}

var tmp = {
  "id": 1,
  "dashboardId": 1,
  "w": 2,
  "h": 2,
  "x": 0,
  "y": 0,
  "i": "n0",
  "minW": 1,
  "minH": 1,
  "maxH": 1000,
  "moved": "false",
  "static": "false",
  "widget": "Photo"
};

mapObjectValues(tmp);

console.log(tmp);
0 голосов
/ 23 октября 2018
for(key in a){

   a[key] == "true" ? a[key] = true : a[key] == "false" ?  a[key] = false : ''; 

}

Вы можете просто зациклить объект и использовать троичный оператор, чтобы сделать его кратким, where a is your original object

0 голосов
/ 23 октября 2018

Вы можете сделать так:

var data = { "id": 1, "dashboardId": 1, "w": 2, "h": 2, "x": 0, "y": 0, "i": "n0", "minW": 1, "minH": 1, "maxH": 1000, "moved": "false", "static": "false", "widget": "Photo" };
Object.keys(data).forEach((key) => {
    if (data[key] === 'false' || data[key] === 'true') {
        data[key] = JSON.parse(data[key]);
    }
});
console.log(data);

`

0 голосов
/ 23 октября 2018

анализировать истинные и ложные строки в массиве, чтобы они стали логическими

Строки в массиве, говорите?Повторите, используя Array.map()

const items = ["true", "false", "something else"]

const booleans = items.map(boolFromStringOtherwiseNull)
console.log({items, booleans}) // show result

function boolFromStringOtherwiseNull(s) {
  if (s == 'true') return true
  if (s == 'false') return false
  return null
}

Объекты?Повторите, используя Object.values()

const data = {"id":1,"dashboardId":1,"w":2,"h":2,"x":0,"y":0,"i":"n0","minW":1,"minH":1,"maxH":1000,"moved":"false","static":"false","widget":"Photo"};

const booleans = Object.values(data).map(boolFromStringOtherwiseNull); // convert
console.log({data, booleans}); // show result

function boolFromStringOtherwiseNull(s) {
  if (s == 'true') return true
  if (s == 'false') return false
  return null
}

Конвертировать только логические строки и поддерживать исходную структуру объекта?

const data = {"id":1,"dashboardId":1,"w":2,"h":2,"x":0,"y":0,"i":"n0","minW":1,"minH":1,"maxH":1000,"moved":"false","static":"false","widget":"Photo"}

const result = Object.entries(data)
  .map(boolFromStringOtherwiseNoOp)    // convert 'boolean strings' to boolean
  .reduce(gatherObjectFromEntries, {}) // collect all entries into 1 object

console.log({data, result});           // result is an object where non-boolean-strings are untouched.

function boolFromStringOtherwiseNoOp([key, value]) {
  if (value == 'true') return [key, true]
  if (value == 'false') return [key, false]
  return [key, value]
}

function gatherObjectFromEntries(accumulation, [key, value]) {
  accumulation[key] = value
  return accumulation
}

Надеюсь, это поможет.Cheers,

0 голосов
/ 23 октября 2018

Вы можете зациклить ключи объекта, а затем сравнить эти логические строки и присвоить фактическое значение Boolean этому свойству:

var data = {"id":1,"dashboardId":1,"w":2,"h":2,"x":0,"y":0,"i":"n0","minW":1,"minH":1,"maxH":1000,"moved":"false","static":"false","widget":"Photo"};
Object.keys(data).forEach((key) => {
  if(data[key] === 'false'){
    data[key] = false;
  }
  if(data[key] === 'true'){
    data[key] = true;
  }
});
console.log(data);
...