Javascript 更改数组对象中的数据

Javascript 更改数组对象中的数据,javascript,reactjs,Javascript,Reactjs,在React应用程序中,我有以下类型的数据: const data = { open: [{ id: 1, name: 'test 1' }, { id: 2, name: 'test 2' }], close: [{ id: 3, name: 'test 3' }, { id: 4, name: 'test 4' }] } 我想迭代open和close数组中的每个对象,并使用附加的type字段返回现有数据

在React应用程序中,我有以下类型的数据:

const data = {
  open: [{
    id: 1,
    name: 'test 1'
  }, {
    id: 2,
    name: 'test 2'
  }],
  close: [{
    id: 3,
    name: 'test 3'
  }, {
    id: 4,
    name: 'test 4'
  }]
}
我想迭代
open
close
数组中的每个对象,并使用附加的
type
字段返回现有数据。例如:

const data = {
  open: [{
    id: 1,
    name: 'test 1',
    type: 'alert'
  }, {...],
  close: [...]
}
我正在尝试类似的操作,但它返回的是
未定义的
,而不是经过修改的数据:

const expandData = (data) => {
  return Object.keys(data).forEach((key) => {
    return data[key].map((item, idx) => ({
      ...item,
      type: 'alert'
    }))
  })
}

// call in another method
expandData(data) // the `data` above

您可以使用
reduce()
代替
forEach()
并返回对象

const data={“open”:[{“id”:1,“name”:“test 1”},{“id”:2,“name”:“test 2”}],“close”:[{“id”:3,“name”:“test 3”},{“id”:4,“name”:“test 4”}]
函数扩展数据(数据){
返回Object.keys(数据)
.减少((r,k)=>{
r[k]=data[k].map(o=>({…o,类型:'alert'}))
返回r;
}, {})
}
常量结果=扩展数据(数据)

console.log(result)
您的代码正在返回forEach调用的结果,该调用始终未定义。(forEach有副作用,但不返回任何内容)

使用
map
代替
forEach

const data={open:[{id:1,
名称:“测试1”
}, {
id:2,
名称:“测试2”
}],
关闭:[{id:3,
名称:“测试3”
}, {
id:4,
名称:“测试4”
}]
};
常数expandData=(数据)=>{
返回Object.keys(data).map((key)=>{//({
…项目,
键入:“警报”
}))
})
}

document.write(“”+JSON.stringify(expandData(data),null,2)+“”)
尝试将lodash与
映射值一起使用

const expandData = (data) => {
  Object.keys(data).forEach((key) => {
    data[key] = data[key].map((item, idx) => ({
      ...item,
      type: 'alert'
    }))
  })
}

// call in another method
expandData(data);
console.log(data); //logs updated data

您只需将新更新的数组从
map
分配到
open
close
属性,而不是返回它们

您的整个代码是正确的,除此之外,您无需更改任何方法。

const expandData = (data) => {
  var result = {};
  Object.keys(data).forEach((key) => {
    result[key] = data[key].map((item, idx) => ({
      ...item,
      type: 'alert'
    }))
  })
 return result;
}
expandData(data);
如果数据不可变,则可以返回新对象,而不是修改相同的
数据
对象

const data = {
  open: [{
    id: 1,
    name: 'test 1'
  }, {
    id: 2,
    name: 'test 2'
  }],
  close: [{
    id: 3,
    name: 'test 3'
  }, {
    id: 4,
    name: 'test 4'
  }]
}

function expandData (data) {
for(let key in data){
    if(data[key] instanceof Array){
    data[key].map(obj => {
    obj.type='alert'
  })
  }
}
return data
}

const result = expandData(data)
console.log(result)
你能行

const数据={
开放式:[{
id:1,
名称:“测试1”
}, {
id:2,
名称:“测试2”
}],
关闭:[{
id:3,
名称:“测试3”
}, {
id:4,
名称:“测试4”
}]
}
函数扩展数据(数据){
返回Object.keys(数据).reduce((a,b)=>{
a[b]=数据[b]。映射(e=>({
E
键入:“警报”
}))
返回a;
}, {});
}
常量结果=扩展数据(数据)

console.log(result)
也可以采用这种方法: 如果你需要它,微笑吧-

const data = {
  open: [{
    id: 1,
    name: 'test 1'
  }, {
    id: 2,
    name: 'test 2'
  }],
  close: [{
    id: 3,
    name: 'test 3'
  }, {
    id: 4,
    name: 'test 4'
  }]
}

function expandData (data) {
  let newObj = {}

    for(let key in data) {
        const objProp = data[key];
        newObj[key] = objProp.map((item, idx) => ({
              ...item,
              type: 'alert'
            }))
    }  

  return newObj;
}

const result = expandData(data)
console.log(result)

您可以创建新对象,并使用新属性映射数组对象

const
expandData=数据=>
对象
.钥匙(数据)
.map(键=>
Object.assign(
{[key]:数据[key].map(o=>Object.assign({},o,{type:'alert'}))}
)
),
数据={open:[{id:1,名称:'test1'},{id:2,名称:'test2'}],close:[{id:3,名称:'test3'},{id:4,名称:'test4'}]};
console.log(expandData(data))

。作为控制台包装{max height:100%!important;top:0;}
尝试使用这种方式,它可以工作:


这将返回forEach调用的结果,该结果仍然是未定义的。Hi@SamHasler,它不会返回数据,但会更新现有数据。请检查将
expandData
从返回新对象的函数更改为变异状态的函数是否正常工作。值得指出的是,如果有人想要拥有不可变的数据,这并不合适。但这里没有提到数据是不可变的。它也没有说数据是可变的,所以最好是安全的,不要对其进行变异。它返回未定义的原因是因为代码返回forEach调用的结果,这将始终是未定义的。(forEach有副作用,但不返回任何内容)。是spread运算符导致了错误。我在代码片段中为您勾选了“使用BabelJS/ES2015”。
const data = {
  open: [{
    id: 1,
    name: 'test 1'
  }, {
    id: 2,
    name: 'test 2'
  }],
  close: [{
    id: 3,
    name: 'test 3'
  }, {
    id: 4,
    name: 'test 4'
  }]
}

function expandData (data) {
  let newObj = {}

    for(let key in data) {
        const objProp = data[key];
        newObj[key] = objProp.map((item, idx) => ({
              ...item,
              type: 'alert'
            }))
    }  

  return newObj;
}

const result = expandData(data)
console.log(result)