根据另一个对象的值创建新属性

3

对于像这样的对象数组:

myArray = [
            {id: "1", type: "xxx"},
            {id: "2", type: "abc"},
            {id: "3", type: "xxx"},
            {id: "4", type: "yyy"}
];

如果需要为每个对象创建另一个受“type”值影响的属性,例如:
如果“type === xxx”,则“newProp = prop1”
如果“type === abc”,则“newProp = prop2”
如果“type === yyy”,则“newProp = prop3”
那么结果数组应如下所示:
myArray = [
            {id: "1", type: "xxx", newProp: "prop1"},
            {id: "2", type: "abc", newProp: "prop2"},
            {id: "3", type: "xxx", newProp: "prop1"},
            {id: "4", type: "yyy", newProp: "prop3"}
];

我用for循环和大量if语句实现了它,但可能有更有效的解决方案我不知道。你有什么想法吗?

2
你应该展示你已经尝试过的代码。 - Andy
你为什么接受一个会创建新数组的答案,而不是在同一个数组上添加新属性呢?有两个答案(Nina和Jonas)可以更好地解决你的问题。 - Ele
@Ele 你说得对。我没有注意到在执行 map 前,我将 newProp 定义为 myArray.newProp = [];,这样会创建一个新的数组。在这种情况下,没有必要先声明它。 - Leo Messi
7个回答

4
您可以使用具有所需类型值的对象。

var myArray = [{ id: "1", type: "xxx" }, { id: "2", type: "abc" }, { id: "3", type: "xxx" }, { id: "4", type: "yyy" }];

myArray.forEach(o => o.newProp = { xxx: 'prop1', abc: 'prop2', yyy: 'prop3' }[o.type]);

console.log(myArray);


3

使用一个包含要添加的值的映射。然后你可以在数组上使用map函数,并返回一个新对象,其中适当的值已经被作为newProp添加:

const map = { xxx: 'prop1', abc: 'prop2', yyy: 'prop3' };
const myArray = [{id: "1", type: "xxx"}, {id: "2", type: "abc"}, {id: "3", type: "xxx"}, {id: "4", type: "yyy"}];

const out = myArray.map(obj => {
  return { ...obj, newProp: map[obj.type] };
});

console.log(out)


创建一个新的数组来实现这种情况?嗯,错了!此外,你不需要那个返回。 - Ele
这并不是“错误”的 - 只是达到相同结论的另一种方式。 - Andy
肯定是错的:需要为受类型值影响的每个对象创建另一个属性-在同一数组中。 - Ele

2
如果你正在寻找一个功能强大的js单行代码,那么这里有一个:
// type2Prop is a object lookup table for type to newProp values
myArray.map(e => (v => v && (e.newProp = v))(type2Prop[e.type]))
注意:它还处理这样的情况,即如果type与已知类型中的任何内容都不匹配,则不会添加属性。

创建一个新的数组来实现这种情况?嗯,错了! - Ele
实际上,同一个数组也具有相同的对象,因为对象引用不会改变。因此,原始数组和新数组都包含更新后的值。如果只对源数组进行修改,请改用 forEach - AP.

1
使用 map:

let myArray = [{id: "1", type: "xxx"},{id: "2", type: "abc"},{id: "3", type: "xxx"},{id: "4", type: "yyy"}];
        
let resp = myArray.map(x => {
  if(x.type === 'xxx') x.newProp = 'prop1';
  if(x.type === 'abc') x.newProp = 'prop2';
  if(x.type === 'yyy') x.newProp = 'prop3';
  return x;
 })
    
console.log(resp);


为什么使用map而不是仅使用forEach?你甚至没有使用map的返回值。 - TKoL
创建一个新的数组来实现这种情况?嗯,错了! - Ele
因为您正在创建一个新数组,而 OP 想要在同一个数组上工作。 - Ele
1
仔细看问题的主体。天哪,这太糟糕了,你正在使用函数map进行循环,创建一个新数组并修改原始数组,我没有意识到这一点。 - Ele
@guijob 请使用forEach来解决这个问题,以避免在社区或未来的操作中产生任何混淆。 - Ele
显示剩余4条评论

1
你可以这样做,并在需要时添加其他类型:

const myArray = [
  {id: "1", type: "xxx"},
  {id: "2", type: "abc"},
  {id: "3", type: "xxx"},
  {id: "4", type: "yyy"}
];
const types = {
  "xxx": "prop1",
  "abc": "prop2",
  "yyy": "prop3",
};
const newArray = myArray.map(e=>{
  return {...e, newProp: types[e.type]};
});
console.log(newArray);


1
  for(const el of myArray)
   el.newProp = {"xxx" : "prop1", "abc": "prop2" /*...*/ }[el.type];

1
尝试使用数组的map()进行以下操作:

var myArray = [
            {id: "1", type: "xxx"},
            {id: "2", type: "abc"},
            {id: "3", type: "xxx"},
            {id: "4", type: "yyy"}
];

myArray = myArray.map(function(i){
  if(i.type==='xxx') i.newProp='prop1'
  else if(i.type==='abc') i.newProp='prop2'
  else if(i.type==='yyy') i.newProp='prop3'
  return i;
});
console.log(myArray);


创建一个新的数组来实现这种情况?嗯,错了! - Ele

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