如何更改字典中的所有键但保留值?

时间:2018-09-06 14:51:51

标签: javascript dictionary key

我的代码中有一个字典,例如:

{1:“苹果”, 2:“葡萄” 3:“瓜” 4:“香蕉” 5:“ ...”, 6:“ ...”, 7:“ ...”}

现在我要处理的是以不中断键的方式从此字典中删除项目。

我的意思是:如果我删除2:“'grapes'”,则字典键在2处应有空格。

我的目标: {1:“苹果”, 2:“瓜” 3:“香蕉” 4:“ ...”, 5:“ ...”, 6:“ ...”}

请记住,每次运行时值都是随机的,因此解决方案不能基于字典中的值。 我完全不知道从哪里开始这个问题,而且一直困扰着我。

我知道将字典改为数组会更容易,但可惜我没有这样做的权限。它必须保留字典。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

正如您所说,它确实应该是一个数组。

但是由于您大概知道要删除的索引,因此只需从此处进行重新编号即可:

function remove(a, index) {
  while (a.hasOwnProperty(index + 1)) {
    a[index] = a[index + 1];
    ++index;
  }
  delete a[index];
  return a;
}

实时示例:

function remove(a, index) {
  while (a.hasOwnProperty(index + 1)) {
    a[index] = a[index + 1];
    ++index;
  }
  delete a[index];
  return a;
}

const a = {1: 'apples', 2: 'grapes', 3: 'melons', 4: 'bananas'};
console.log("before:", Object.entries(a).join("; "));

remove(a, 2);
console.log("after:", Object.entries(a).join("; "));

请注意,在某些JavaScript引擎上,在对象上使用delete会大大减慢随后对其属性的访问。您可以改为创建 replacement 对象:

function remove(a, index) {
  const rv = {};
  let delta = 0;
  for (let n = 1; a.hasOwnProperty(n); ++n) {
    if (n === index) {
      delta = -1;
    } else {
      rv[n + delta] = a[n];
    }
  }
  return rv;
}

function remove(a, index) {
  const rv = {};
  let delta = 0;
  for (let n = 1; a.hasOwnProperty(n); ++n) {
    if (n === index) {
      delta = -1;
    } else {
      rv[n + delta] = a[n];
    }
  }
  return rv;
}

let a = {1: 'apples', 2: 'grapes', 3: 'melons', 4: 'bananas'};
console.log("before:", Object.entries(a).join("; "));

a = remove(a, 2);
console.log("after:", Object.entries(a).join("; "));


但同样,确实应该使用为此设计的数据结构:数组:

const a = ['apples', 'grapes', 'melons', 'bananas'];
console.log("before:", Object.entries(a).join("; "));

a.splice(1, 1); // Remove the entry at index 1
console.log("after:", Object.entries(a).join("; "));

答案 1 :(得分:1)

认为这样的事情应该起作用。您需要注意JavaScript对象不能具有数字键(它们已隐式强制转换为字符串)。

var dict = {
  1 : 'a',
  2 : 'b',
  3 : 'c',
  4 : 'd',
  5 : 'e'
};//note, that JS objects can't have numeric keys. These will be coerced to strings

function reKeyDict(obj){
  var keys = Object.keys(obj);//get an array of all keys;
  var len = keys.length;
  var greatest = Math.max(...keys);
  keys = keys.sort(function(a,b){ return a - b; });
  for(i = 1; i <= len; i++){//this needs to change if you want zero based indexing.
    if(! keys.includes(i+"")){//we need to coerce to string 
      //we found a gap
      for(var j = i+1, openSlot = i; j <= greatest; j++){
        if(obj[j] !== undefined){
          obj[openSlot++] = obj[j];
          delete obj[j];
        }
      }
    }
  }
}

delete dict['3'];
delete dict['4'];
reKeyDict(dict);
console.log(dict);

如上所述,这实际上不是JavaScript对象的用例。为此创建的数据结构是一个数组。但是...如果您需要这样做,希望对您有所帮助。

上面的代码正在执行稳定的操作(这意味着将保留原始对象的顺序)。

答案 2 :(得分:-1)

这是一个数组还是一个对象?这是从对象执行操作的方法,如果它是数组,则只需将值部分替换为数组。

对象:

const obj = { 1: 'a', 2: 'b', 3: 'c' }
const values = Object.values(obj) // [ 'a', 'b', 'c' ]
const newObj = values.reduce((acc, value, i) => {
    acc[i+5] = value // replace i+5 with whatever key you want
    return acc
}, {})
// {5: "a", 6: "b", 7: "c"}

编辑: 糟糕...您的标题“如何更改字典中的所有键但保留值?”和描述希望相反的事情发生。