我有一个JavaScript数组。用户以值和名称的形式输入字符串和放置在此数组中的数据。
if(!_.isUndefined(args[1]) && !_.isUndefined(args[2])) {
if(args[1].length !== 0 && args[2].length !== 0) {
var dataObj = {
name : args[1],
value : args[2]
};
formateArray.push({name: dataObj.name, value:dataObj.value});
如何从数组中删除重复值并将其替换为用户输入的最新值?
因此,当用户输入:value_1 100, value_2 200, value_1 500
时
我希望看到:value_1 500, value_2 200
(用新数据替换重复项)
答案 0 :(得分:1)
如果名称已存在,您可以迭代数组替换值。
function push(array, newVal) {
var found = false;
for (var i = 0; i < array.length && !found; i++) {
if (array[i].name === newVal.name) {
array[i].value = newVal.value;
found = true;
}
}
if (!found) {
array.push(newVal);
}
}
function printNameValue(array) {
var out = '';
for (var i = 0; i < array.length; i++) {
out += array[i].name + ' ' + array[i].value + ', ';
}
return out;
}
var myArray = [];
push(myArray, {
name: 'value_1',
value: 100
});
push(myArray, {
name: 'value_2',
value: 200
});
push(myArray, {
name: 'value_1',
value: 500
});
alert(printNameValue(myArray));
答案 1 :(得分:0)
我建议您使用一个像哈希表一样的对象,而不是数组对象。您可以通过这种方式定义var formateArray = {};
当您想要添加或编辑数据时,您可以这样做:
formateArray[dataObj.name] = {name: dataObj.name, value:dataObj.value};
如果密钥不存在dataObj.name
,则会添加该密钥。密钥存在,值将使用新值设置。
如果您想要数组的大小,可以通过Object.keys(formateArray).length
如果您想循环访问数据,可以这样做:
for (var k in formateArray) {
// use hasOwnProperty to filter out keys from the Object.prototype
if (formateArray.hasOwnProperty(k)) {
alert('key is: ' + k + ', value is: ' + formateArray[k].value);
}
}
Here是一个说明这一点的小说。
答案 2 :(得分:0)
由于您的值可以与有意义的键相关联,因此您可能应该使用对象映射而不是数组来存储值。现在避免重复变得微不足道,因为你不能有重复的密钥。
var valuesMap = {};
//setting value
valuesMap.value_1 = 100;
//setting another value
valuesMap.value_2 = 200;
//replacing it
valuesMap.value_1 = 500;
否则它仍然很简单,但效率较低:
function add(arr, obj) {
var key = obj.name, i, len;
for (i = 0, len = arr.length; i < len; i++) {
if (arr[i].name === key) {
arr[i] = obj;
return;
}
}
arr.push(obj);
}
var values = [];
add(values, { name: 'test', value: 1 });
add(values, { name: 'test', value: 2 });
values.length; //1