2017-08-28 70 views
0

我有一个多维数组,其中每个数组里面(放在用户)的所有用户信息的组合如何覆盖JavaScript中的多维数组中的数据?

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

userList保存在JSON上,这个想法应该是保存更改并从那里加载。

例子:

如果我的阵列有

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

     [ 
     ['Isaac', 'Garth', '[email protected]', 'Mazda'] 
     ['Matthew', 'Miller', '[email protected]', 'Volvo'] 
     ] 
} 

,并让说,艾萨克登录,他希望改变他的名字Gabriel和更改电子邮件至[email protected],使新阵列将是:

userList= [ 
     ['Gabriel', 'Garth', '[email protected]', 'Mazda'] 
     ['Matthew', 'Miller', '[email protected]', 'Volvo'] 
     ] 

这怎么可能完成?

只有JS和HTML请。

+0

@IssacG你只想要JS解释或HTML标签吗? –

+0

你可以改变结构吗?我建议使用一个对象数组而不是数组数组, –

+0

你好。我编辑线程提到我正在使用JSON,稍微修改了代码以显示加载JSON保存的示例。 JS的解释可以,我已经在使用HTMl表单的contenteditable。数据正在更新,只是没有保存。顺便说一句我正在使用数组数组(我认为这就是所谓的矩阵?),因为它是我知道的唯一方法,我不知道对象数组是什么。 – IsaacG

回答

1

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

这种方法变异,而不是返回一个新的参考,这可能会导致不希望的副作用的初始阵列。

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

 
// example 
 
var userList= [ 
 
    ['Isaac', 'Garth', '[email protected]', 'Mazda'], 
 
    ['Matthew', 'Miller', '[email protected]', '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', '[email protected]', 'Mazda'], 
 
    ['Matthew', 'Miller', '[email protected]', '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' /* ... */ } 
// ... 
] 
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:"[email protected]", 
car:"VW" 
}); 

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