用很多键替换对象数组中的一些值

时间:2019-02-07 16:09:09

标签: javascript arrays object

我有一个对象数组,每个对象都有很多键(> 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。

感谢您的帮助

6 个答案:

答案 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)