如何替换对象中键的值

时间:2018-11-14 06:14:52

标签: javascript reactjs redux react-redux

他是react redux的新手。我有一个像这样的对象数组,

let result = [ {Id :'a',temp:5,data:'abc (c:1'},{Id :'a',temp:5,data:'pqr (c:1'}{Id :'a',temp:5,data:'xyz (c:1'}]

现在,我要做的是有一个名为data的键,它带有一些值,我想仅在该数据键中采用该括号之前的值。

我想看什么对象,

{Id :'a',count:5,data:'abc'}

我有什么, 我有一个用于获取该值的正则表达式,

我已经使用过循环了,

for (let i = 0; i <= result.length - 1; i++) {
         let regex = /^[^\(]+/;
         let value = data.match(regex)[0].trim();
        result[i].data = value 
      }


fetchQuestions() {
    let previous_data = { ...this.props.data  };
    let result = [];
    for (let key in previous_data) {
      result = [...result, ...previous_data[key]];
    }
    for (let i = 0; i <= result.length - 1; i++) {
      let regex = /^(.*)\(/;
      let value = result[i].technology.match(regex)[1].trim();
      result[i].technology = value;
    }
    this.props.fetchQuestions(result);
  }

在这个this.props.data中是化简器数据。现在我要做的是,我必须从中获取一些数据并进行一些操作。但是在这里,它是直接更新我的reducer值本身,但是我使用了散布运算符来获取该数据的副本,但是仍然使用它来更新reducer值。

但是我没有得到我期望的价值。有人可以帮我吗?

5 个答案:

答案 0 :(得分:2)

您可以编写一个正则表达式,为(之前的值创建一个组,然后从匹配项中获取它

let result= [
  {
    Id: 'a',
    temp: 5,
    data: 'abc (c:1'
  },
  {
    Id: 'a',
    temp: 5,
    data: 'pqr (c:1'
  },
  {
    Id: 'a',
    temp: 5,
    data: 'xyz (c:1'
  }
]
for (let i = 0; i <= result.length - 1; i++) {
         let regex = /^(.*)\(/;
         let value = result[i].data.match(regex)[1].trim();
        result[i].data = value 
    }
    
console.log(result);

答案 1 :(得分:1)

您需要在迭代时访问每个对象的data属性,以便在其上使用.match

let result = [{
  Id: 'a',
  temp: 5,
  data: 'abc (c:1'
}, {
  Id: 'a',
  temp: 5,
  data: 'pqr (c:1'
}, {
  Id: 'a',
  temp: 5,
  data: 'xyz (c:1'
}];
for (let i = 0; i <= result.length - 1; i++) {
  const { data } = result[i];
  let regex = /^[^\(]+/;
  let value = data.match(regex)[0].trim();
  result[i].data = value;
}
console.log(result);

但是,看到您正在使用react时,您可以考虑使用.map来代替,它不会使原始对象发生变异:

let result = [{
  Id: 'a',
  temp: 5,
  data: 'abc (c:1'
}, {
  Id: 'a',
  temp: 5,
  data: 'pqr (c:1'
}, {
  Id: 'a',
  temp: 5,
  data: 'xyz (c:1'
}];
console.log(
  result.map(({ data, ...rest }) => ({
    data: data.match(/^[^(]+[^( ]/)[0],
    ...rest
  }))
);

请注意,如果您在正则表达式[^( ]中进行最后匹配的字符(除(或空格之外的任何字符),就不再需要trim

答案 2 :(得分:0)

您可以使用split('(')代替正则表达式来获得相同的输出:

let result = [{
  Id: 'a',
  temp: 5,
  data: 'abc (c:1'
}, {
  Id: 'a',
  temp: 5,
  data: 'pqr (c:1'
}, {
  Id: 'a',
  temp: 5,
  data: 'xyz (c:1'
}];
for (let i = 0; i <= result.length - 1; i++) {
  let value = result[i].data.split('(')[0].trim();
  result[i].data = value
}
console.log(result);

答案 3 :(得分:0)

尝试这个。

  result.map(el => {
        el.data = el.data.match(/^(\w+)/)[0];
        return el;
    })

答案 4 :(得分:0)

let result = [ {Id :'a',temp:5,data:'abc (c:1'},{Id :'a',temp:5,data:'pqr (c:1'},{Id :'a',temp:5,data:'xyz (c:1'}]

const new_result = result.map((item) => {
    let regex = /^[^\(]+/;
  let value = item.data.match(regex)[0].trim();
  item.data = value;
  return item;
});

console.log(new_result);