如何在javascript中覆盖多维数组中的数据?

时间:2017-08-28 14:27:02

标签: javascript html arrays

我有一个多维数组,其中每个数组都是所有用户信息的组合(由用户输入)

我希望用户能够修改他的信息,例如他的姓名或电话号码,以便下次用户登录时,会显示他的新信息。

userList保存在JSON上,我们的想法是从那里保存和加载更改。

示例:

如果我的数组有

    userList= JSON.parse(localStorage.getItem('userListLS')
     if(userList == null) {
userList =

      [
       ['Isaac', 'Garth', 'IsaacG11@email.com', 'Mazda']
       ['Matthew', 'Miller', 'mmiller21@mail.com', 'Volvo']
      ]
}

让我们说Isaac已登录,他希望将自己的名字改为Gabriel并将电子邮件更改为IsaacG21@email.com,以便新阵列成为:

userList= [
       ['Gabriel', 'Garth', 'IsaacG21@email.com', 'Mazda']
       ['Matthew', 'Miller', 'mmiller21@mail.com', 'Volvo']
      ]

怎么可以实现呢?

只有JS和HTML。

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用索引选择器直接修改数据:

  

这种方法改变了初始数组,而不是返回一个新的引用,这可能导致不必要的副作用。



function modifyData(data, userId, fieldId, newData) {
   if(data[userId] && data[userId][fieldId]) {
      data[userId][fieldId] = newData;
   }
   return data;
}

// example
var userList= [
  ['Isaac', 'Garth', 'IsaacG11@email.com', 'Mazda'],
  ['Matthew', 'Miller', 'mmiller21@mail.com', 'Volvo']
];
const FIELD_NAME_ID = 0;
const USER_ID = 0;

var modified = modifyData(userList, USER_ID, FIELD_NAME_ID, 'Morty')

console.log('initial', userList);
console.log('modified', modified);




不可变的方法是:



function modifyData(data, userId, fieldId, newData) {
   if(data && data[userId] && data[userId][fieldId]) {
      var _data = data.slice();
      var _user = data[userId].slice();
      _user[fieldId] = newData;
      _data[userId] = _user;
      return _data;
   }
   return data;
}

// example
var userList= [
  ['Isaac', 'Garth', 'IsaacG11@email.com', 'Mazda'],
  ['Matthew', 'Miller', 'mmiller21@mail.com', 'Volvo']
];
const FIELD_NAME_ID = 0;
const USER_ID = 0;



var modified = modifyData(userList, USER_ID, FIELD_NAME_ID, 'Morty');

console.log('initial', userList);
console.log('modified', modified);




但是你应该考虑将你的结构改为对象字典:

{
 user1: { name: 'Isaac', lastName: 'Garth' /* ... */ }
 // ...
}

或一组对象(但是你必须在数组中找到合适的用户:

[
 { name: 'Isaac', lastName: 'Garth' /* ... */ }
 // ...
]

答案 1 :(得分:0)

地图的一个很好的用例:

const users = new Map(
  userList.map(
   ( [first,name,email,car]) => [first, { first,name,email,car }]
  )
);

所以要更改某些用户的电子邮件:

users.get("Isaac").email = "test @ gmail.com";

更多用例:

//set a whole user:
users.set("Jack", {
 first:" Jack",
 name:"Daniels",
 email:"me@example.com",
 car:"VW"
});

//get an array of users again
userList = [...users.values()];