从数组中删除重复的值并将其替换为javascript中的最新值

时间:2014-02-05 00:03:48

标签: javascript

我有一个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(用新数据替换重复项)

3 个答案:

答案 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