我有一个对象数组,每个对象都有很多键(> 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
}
我不知道如何完成代码。 我想要一个新对象而不要修改数据对象,所以我使用map而不是foreach。
感谢您的帮助
答案 0 :(得分:1)
在Object.keys上使用forEach循环并替换值
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)
答案 1 :(得分:0)
工作示例: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;
});
答案 2 :(得分:0)
您可以将替换字符串收集到数组中并进行检查。
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; }
答案 3 :(得分: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;
})
}
有关实现我在上面调用的clone()
函数的各种方法,请参见How do I correctly clone a JavaScript object?。
答案 4 :(得分:0)
我将创建一个数组,该数组的值应该被替换,而不是像您那样映射
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);
答案 5 :(得分:0)
您可以使用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)