Заменить некоторые значения в массиве объектов множеством ключей - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть массив объектов, каждый из которых имеет много ключей (> 200).Некоторые значения этих ключей могут быть «-», «» или «na».Я хочу заменить эти значения на ноль.

Пример:

[
  {
    "waste ": "",
    "d_f": "-",
    "sa": "  - ",
    "fgdf-h": "na",
    "gdws": "0",
    "ffd ": "121.4",
    " tg": "34",
    "yyy rd": "1,23 ",
    "abd": " 45678",
    "abd": " 4.567,8",
    "edf": " na",
    "first": "-   ",
    ...
  },
  {...},
]

должен стать:

[
  {
    "waste ": null,
    "d_f": null,
    "sa": null,
    "fgdf-h": null,
    "gdws": "0",
    "ffd ": "121.4",
    " tg": "34",
    "yyy rd": "1,23 ",
    "abd": " 45678",
    "abd": " 4.567,8",
    "edf": null,
    "first": null,
    ...
  },
  {...},
]

Это мой код:

function uniformNoData(data) {
  const result = data.map((datum, i) => {
    return Object.values(datum).map(d => {
      // and then ??
    })
    return datum
  })
  return result
}

Я не знаю, как завершить код .. Я хочу новый объект, а не изменять объект данных, поэтому я использовал карту, а не foreach.

Любая помощь приветствуется

Ответы [ 6 ]

0 голосов
/ 07 февраля 2019

Вы можете использовать forEach и регулярное выражение.

^(|[- ]+|\s*na\s*)$
  • ^ - Начало строки.

  • (|[- ]+|\s*na\s*) - Соответствует пустой строке, строка с - and space, соответствует любому na с любым количеством пробелов спереди и сзади.

  • $ - Конец строки.

let obj = { "waste ": "","d_f": "-","sa": "  - ",  "fgdf-h": "na","gdws": "0","ffd ": "121.4"," tg": "34","yyy rd": "1,23 ","abd": " 45678","abd": " 4.567,8","edf": " na","first": "-   ",}
  
let newObj = {}
  
let op = Object.keys(obj).forEach(e=>{
  newObj[e] = /^(|[- ]+|\s*na\s*)$/g.test(obj[e]) ? null : obj[e]
})

console.log(newObj)
0 голосов
/ 07 февраля 2019

Я бы создал массив со значениями, которые должны быть заменены, чем map, как вы сделали

const data = [
    {
        "waste ": "",
        "d_f": "-",
        "sa": "  - ",
        "fgdf-h": "na",
        "gdws": "0",
        "ffd ": "121.4",
        " tg": "34",
        "yyy rd": "1,23 ",
        "abd": " 45678",
        "abd": " 4.567,8",
        "edf": " na",
        "first": "-   ",
    },
];

const garbage = ["", "na", "-"];

const cleanData = data.map(e => {
    const obj = {};
    for  (let key in e) {
        obj[key] = garbage.includes(e[key].trim()) ? null : e[key];
    }
    return obj;
});


console.log(cleanData);
0 голосов
/ 07 февраля 2019

Вы не можете использовать Object.values() для этого.Вам нужно перебрать Object.keys(), чтобы у вас был ключ для обновления записи.

function uniformNoData(data) {
  data.map((datum) => {
    datum = clone(datum);
    Object.keys(datum).forEach(key => {
      if (datum[key] == "na" || datum[key] == "-" || datum[key] == "") {
        datum[key] = null;
      }
    });
    return datum;
  })
}

См. Как правильно клонировать объект JavaScript? для различных способов реализации функции clone(), которую я вызывал выше.

0 голосов
/ 07 февраля 2019

Вы можете собрать замещающие строки в массиве и проверить.

var data = [{ "waste ": "", d_f: "-", sa: "  - ", "fgdf-h": "na", gdws: "0", "ffd ": "121.4", " tg": "34", "yyy rd": "1,23 ", abd: " 4.567,8", edf: " na", first: "-   " }],
    nullValues = ['', '-', 'na'],
    result = data.map(o => Object.assign({}, o, ...Object.keys(o).filter(k => nullValues.includes(o[k].trim())).map(k => ({ [k]: null }))));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 07 февраля 2019

Рабочий пример : https://jsfiddle.net/0gdr9t7f/

const badVals = ['-', 'na'];   

const newArr = arr.map(entry => {
    Object
    .keys(entry)
    .forEach(key => {
         const val = entry[key].trim();
         if (!val || badVals.includes(val)) {
            entry[key] = null;
         }
    })
    return entry;
});
0 голосов
/ 07 февраля 2019

Используйте цикл forEach для Object.keys и замените значения

var a = [{
  "waste ": "",
  "d_f": "-",
  "sa": "  - ",
  "fgdf-h": "na",
  "gdws": "0",
  "ffd ": "121.4",
  " tg": "34",
  "yyy rd": "1,23 ",
  "abd": " 45678",
  "abd": " 4.567,8",
  "edf": " na",
  "first": "-   ",
}]
var obj = {};
a.forEach((x) => {
  Object.keys(x).forEach((e) => {
    if (x[e].trim() == "na" || x[e].trim() == "-" || x[e].trim() == "")
      obj[e] = null;
    else
      obj[e] = e;
  })
})

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