更新嵌套数组中的元素,不可变

时间:2018-06-03 16:49:03

标签: javascript ecmascript-6

我试图在下面的json中更新BMW 730d的价格。

汽车对象应该是一个新对象,(Immutability),所以我需要使用map函数。

而且我不想使用像immutable或normalizr这样的库。我的目标是了解地图功能,但我仍在评估品牌名称。

const cars =
[
    {
        brand: 'BMW',
        model: [
            {
                name: '535d',
                price: 35000
            }, {
                name: '730d',
                price: 55000
            }
        ]
    },
    {
        brand: 'Mercedes',
        model: [
            {
                name: 'roadstar',
                price: 75000
            },
        ]
    },
];

这是我到目前为止所做的:

// trying to update the price of a BMW 730d

const newCars= cars.map(brand => {
    console.log(brand);
    // and now ?

});

但现在我被困了。

谁帮帮我?

谢谢!

[编辑]我添加了一个id"品牌"在json中识别模型。

3 个答案:

答案 0 :(得分:1)

您将检查当前对象是否与BMW有关并返回一个新对象(带有所需的新模型列表),否则只返回未更改的对象:

const newCars = cars.map(car => {
    if (car.brand == "BMW") {
        return {
            brand: "BMW",
            model: car.model.map(model => {
                // …
            }),
        };
    } else {
        return car;
    }
});

要更新model数组中的相应对象,请再次使用完全相同的方法。

答案 1 :(得分:0)

作为一种技术性,你对不变性的描述是不正确的。不可变意味着基本无法变异。在你的情况下,你只是决定不变异。

不幸的是,根据您的数据结构,您必须有点凌乱才能提取密钥。 Object.keys是我能想到的最佳方式。它返回一个数组,因此您必须键入索引0

cars.map(car => {
  const brand = Object.keys(car)[0];
  if (brand === 'BMW') {
  }
})

答案 2 :(得分:-1)

你必须测试对象的属性,你可以使用对象的方法“hasOwnProperty”来知道对象x是否具有属性y,在你的情况下你要做以下测试:

protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        Globals.ThisAddIn.Application.SheetSelectionChange += Application_SheetSelectionChange;
    }

    private void Application_SheetSelectionChange(object Sh, Excel.Range Target)
    {
        tdsRelTbox.Text = Target.Address;
    }

    protected override void OnClosed(EventArgs e)
    {
        base.OnClosed(e);
        Globals.ThisAddIn.Application.SheetSelectionChange -= Application_SheetSelectionChange;
    }