У меня есть массив объектов, каждый из которых имеет много ключей (> 200). Некоторые значения этих ключей могут быть "-", "" или "na". Я хочу заменить эти значения на null.
Пример:
[
{
"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.
Любая помощь приветствуется



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте цикл 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.info(obj)Не забудьте нажать кнопку Tidy после редактирования фрагмента.
Рабочий пример: 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;
});
Вы можете собрать строки замены в массив и проверить.
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.info(result);.as-console-wrapper { max-height: 100% !important; top: 0; }Вы не можете использовать для этого 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(), которую я вызвал выше.
Я бы создал массив со значениями, которые следует заменить, а не карту, как вы
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.info(cleanData);Вы можете использовать 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.info(newObj)
Я не хочу заменять объект, хочу копию