简体   繁体   English

过滤对象并修改属性

[英]filtering object and modify properties

I am having a newbie question and I have tried to read the manuals over and over and cannot figure it out.我有一个新手问题,我试图一遍又一遍地阅读手册,但无法弄清楚。

so I have this code:所以我有这个代码:

export function editSerier(data, products) {
    return (dispatch) => {

        const filteredProducts = Object.assign(
            ...Object.keys(products)
                .filter(key => products[key].Artikelgrupp === data.Artikelgrupp)
                .map(k => ({ 
                    [k]: products[k]:{
                    Beskrivning: data.Beskrivning,
                    kategori: data.kategori,
                    status: data.status,
                    synas: data.synas,
                    tillverkare: data.tillverkare,
                    titel: data.titel}
                })

            })



        console.log(filteredProducts)
    }
}

Where I want to filter the incoming object products by "Artikelgrupp" and then modify the existent properties of the remaining products with properties from "data".我想通过“Artikelgrupp”过滤传入的对象产品,然后使用“数据”中的属性修改剩余产品的现有属性。

However this code does not let me run it.但是这段代码不允许我运行它。 Does someone have any idea?有人有什么想法吗?

UPDATE: just solved it by merging both objects更新:刚刚通过合并两个对象来解决它

const filteredProducts = Object.assign(
            ...Object.keys(products)
                .filter(key => products[key].Artikelgrupp === data.Artikelgrupp)
                .map(k => ({ 
                    [k]: {...products[k], ...data}
                }))
        )

You have invalid JavaScript.您的 JavaScript 无效。 If you want a nested object, you need { something: { } } and if you want to use a computed property name, you need to surround it with [] .如果你想要一个嵌套对象,你需要{ something: { } } ,如果你想使用计算属性名称,你需要用[]将它括起来。

So, this will work所以,这会起作用

export function editSerier(data, products) {
  return dispatch => {
    const filteredProducts = Object.assign(
      ...Object.keys(products)
        .filter(key => products[key].Artikelgrupp === data.Artikelgrupp)
        .map(k => ({
          [k]: {
            [products[k]]: {
              Beskrivning: data.Beskrivning,
              kategori: data.kategori,
              status: data.status,
              synas: data.synas,
              tillverkare: data.tillverkare,
              titel: data.titel
            }
          }
        }))
    );

    console.log(filteredProducts);
  };
}

If I understand correctly, you are wanting to obtain a single object which:如果我理解正确,您想获得一个单一的对象:

  • excludes all value objects of products where a Artikelgrupp field does not match data.Artikelgrupp and,排除Artikelgrupp字段与数据不匹配的products所有值对象data.Artikelgrupp和,
  • the specific fields Beskrivning , kategori , etc, from your data object are merged/copied into the product values of the resulting object特定的字段Beskrivningkategori等,从data对象被合并/复制到所产生的对象的乘积值

One solution to this would be as对此的一种解决方案是

/* Extract entry key/value pairs from products object */
Object.entries(products)
/* Reduce entry pairs to required object shape */
.reduce((result, [key, value]) => {

  /* Substitute for prior filter step. Avoid overhead of array copy
  between prior filter and this reduction. */
  if(value.Artikelgrupp !== data.Artikelgrupp) {
    return result;
  }

  /* Update result object, "upserting" fields of data object into 
  existing product value, for this reduce iteration */
  return {
    ...result,
    [ key ] : {
        ...value,
        Beskrivning: data.Beskrivning,
        kategori: data.kategori,
        status: data.status,
        synas: data.synas,
        tillverkare: data.tillverkare,
        titel: data.titel     
    }
  };

}, {})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM