返回具有给定键及其值的新对象

时间:2019-12-30 13:29:46

标签: javascript javascript-objects

正如标题所述,我正在尝试使用给定的键返回一个新对象,并将其值翻转,并使所有其他键/值对保持不变。

这是我到目前为止所拥有的:

function swapKeyAndValue(obj, key) {
  
  const result = [];
  for (const property in obj) {result.push(obj); }
  return result;
}

var instructor = { name: 'Elie', job: 'Instructor' };

console.log(
  swapKeyAndValue(instructor, 'name'),
  swapKeyAndValue(instructor, 'job')
  );

问题是我仍在学习javascript的来龙去脉,而且我不确定如何使该对象停止以数组形式返回,并且还满足标题中的要求。

以下是我要返回的示例:

var instructor = { name: 'Elie', job: 'Instructor' };

swapKeyAndValue(instructor, 'name');
// {Elie: 'name', job: "Instructor"}

swapKeyAndValue(instructor, 'job');
// {name: "Elie", Instructor: 'job'}

5 个答案:

答案 0 :(得分:1)

这一个有效!

function swapKeyAndValue (obj, key) {
const newObj = {};
for (let keys in obj) {
if (keys === key) {
  newObj [obj[keys]] = key;
}
if (keys !== key) {
  newObj[keys] = obj[keys];
}
}
return newObj;

}
var instructor = { name: 'Elie', job: 'Instructor' };
swapKeyAndValue(instructor, 'name');

答案 1 :(得分:0)

您创建了一个创建新数组的函数,

但是据我了解,您想更改特定的对象结构

因此,此代码是实现此目的的方法:

function swapKeyAndValue(obj, key) {
  value = obj[key]
  if (value){
    obj[value]=key
    delete obj[key]
  }
}

var instructor = { name: 'Elie', job: 'Instructor' };

 swapKeyAndValue(instructor, 'name')
console.log(instructor);
 swapKeyAndValue(instructor, 'Elie')
console.log(instructor);
 swapKeyAndValue(instructor, 'name')
console.log(instructor);

我希望这会有所帮助! :)

答案 2 :(得分:0)

这里不需要循环。取而代之的是,使用括号表示法获取当前键的值,然后设置新键(即值),并将新值设置为通过的键。然后,您需要像这样删除从对象传递过来的旧密钥:

function swapKeyAndValue({...obj}, key) { // {...obj} will copy the object (so it doesn't change the object passed through directly)
  if (obj.hasOwnProperty(key)) { // check if key is in the object
    const new_key = obj[key]; // grab value
    obj[new_key] = key;
    delete obj[key];
  }

  return obj;
}

const instructor = {
  name: 'Elie',
  job: 'Instructor'
};

console.log(
  swapKeyAndValue(instructor, 'name'),
  swapKeyAndValue(instructor, 'job')
);

这是另一种效率较低的方法,但是允许您使用Object.fromEntries()Object.entries().map()来保持键值顺序:

const swapKeyAndValue = (obj, key) =>
  Object.fromEntries(Object.entries(obj).map(([k, v]) => k===key ? [v, k] : [k, v]));

const instructor = {
  name: 'Elie',
  job: 'Instructor'
};

console.log(
  swapKeyAndValue(instructor, 'name'),
  swapKeyAndValue(instructor, 'job')
);

答案 3 :(得分:0)

实际上,使用reduce

可以轻松实现所需的内容

function swapKeyAndValue(obj, key) {
  const reducer = (accum, ck) => {  // ck is the current key
    if (ck === key) {          // if ck is the key that we want to swap, we enter.
      const val = obj[ck];     // take the value to a var
      accum[val] = key;       // then we swap it
    } else {
      accum[ck] = obj[ck];    // we dont swap anything...
    }
    return accum;             // we return our partially build obj
  }
  return Object.keys(obj).reduce(reducer, {});
}

var instructor = {
  name: 'Elie',
  job: 'Instructor'
};

console.log(
  swapKeyAndValue2(instructor, 'name'),
  swapKeyAndValue(instructor, 'job')
);

代码中的问题是您正在构建Array,然后期望它不是一个。

function swapKeyAndValue(obj, key) {

  const result = [];  // <---- you define an array, therefore if you return this, it will be an array
  for (const property in obj) {result.push(obj); }
  return result;
}

要使您的功能正常工作,您可以采用与我上面提到的reduce类似的方法

function swapKeyAndValue2(obj, key) {
  const result = {};
  for (const property in obj) {
    if (property === key) {
      // we swap
      const val = obj[property];
      result[val] = property;
    } else {
      // we dont swap
      result[property] = obj[property];
    }
  }
  return result;
}

答案 4 :(得分:0)

这是使用For循环和2个If语句解决此问题的另一种简单方法!

function swapKeyAndValue(obj, swappedKey){
  var result = {};
  for(var key in obj){
  if(key === swappedKey){
    result[obj[key]] = swappedKey;
  }
    if(key !== swappedKey){
    result[key] = obj[key];
  }
}
return result;

}