JavaScript - 遍历对象并更改嵌套属性

3

这是一个需要处理的对象:

var q = {
    email: {contains: "noname@hotmail.com"},
    name: {contains: "someuser"}
};

我希望能够遍历q的每个键,如果相应的值是一个具有属性contains的对象,则用$regex替换它。

6个回答

2

相关信息可以在这里找到:JavaScript: Object Rename Key

你可以尝试以下方法:

var q = {
    email: {contains: "noname@hotmail.com"},
    name: {contains: "someuser"}
};
for(var k in q){
  if(q[k].hasOwnProperty('contains')){
    Object.defineProperty(q[k], '$regex',
                Object.getOwnPropertyDescriptor(q[k], 'contains'));
    delete q[k]['contains'];
  }
}

console.log(q);


1
 for(const obj of Object.values(q)) {
   obj.$regex = obj.contains;
   delete obj.contains;
 }

只需遍历q中的所有值,并将contains属性复制到$regex属性中。


2
如果 q 包含非对象属性,则此代码在严格模式下将失败。循环可以通过 if (obj.hasOwnProperty("contains")) 来保护。 - Guillaume Georges

0

var q = {
    email: {contains: "noname@hotmail.com"},
    name: {contains: "someuser"}
};
Object.keys(q).forEach(k => {

if (typeof q[k].contains != 'undefined'){
    q[k].$regex =  q[k].contains;
    delete q[k].contains;
}
})

console.log(q);

Other version using Es 6 features

const renameProp = (
  oldProp,
  newProp,
  { [oldProp]: old, ...others }
) => {
  return {
    [newProp]: old,
    ...others
  };
};
let q = {
    email: {contains: "noname@hotmail.com"},
    name: {contains: "someuser"}
};

let newObj = {}

for (let propName in q) {
newObj[propName] = renameProp("contains","$regex",q[propName])
}
console.log(newObj)


0

var q = {
  email: {
    contains: "noname@hotmail.com"
  },
  name: {
    contains: "someuser"
  },
  asdf: "asdf"
};

Object.keys(q).forEach(function(item, index) {
  if (typeof q[item] == "object" && q[item].contains) {
    q[item].$regex = q[item].contains;
    delete q[item].contains;
  }
})


你如何在 q[item].contains 上应用正则表达式? - Ali Celebi
更新了我的回答。 - Vinod Sai

0

您可以循环遍历对象,首先将contains属性的当前值放入$regex中,然后删除contains属性。

以下是可行的代码:

var q = {
  email: {
    contains: "noname@hotmail.com"
  },
  name: {
    contains: "someuser"
  }
};

for (var i of Object.values(q)) {
  if (i.hasOwnProperty("contains")) {
      i.$regex = i.contains;
      delete i.contains;
    }
  }



  console.log(q);


0

要遍历对象键,首先必须获取它们,这里有一种简单的方法

const keys = Object.keys(q); // ["email", "name"]

现在迭代我们得到的数组并执行正则表达式测试;
keys.forEach(key => {
    let value = q[key].contains;
    // create $regex and assign value 
    // remove .contains
})

不确定注释掉的部分。您如何创建$regex并分配值以删除.contains属性? - Ali Celebi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接