javascript - VueJS 根据 watch 中的键从对象数组中获取唯一值

标签 javascript vue.js ecmascript-6

我有一个 watch 来检查所选标签:

watch: {
  search (val) {
    for (let i = 0; i < val.length; i++) {
      this.form_data.products_credit.push({
        product_id: val[i].id,
        quantity: null,
        package_size: null,
        purchase_price: null,
        warehouse_id: null
      });
    }
  }
}

这工作正常,但当用户选择例如 tag1 时就会出现问题 this.form_data.products_credit 值等于:

[
  {
    product_id: 1,
    quantity: null,
    package_size: null,
    purchase_price: null,
    warehouse_id: null
  }
]

之后,如果用户选择tag2,则this.form_data.products_credit结果将是:

[
      {
        product_id: 1,
        quantity: null,
        package_size: null,
        purchase_price: null,
        warehouse_id: null
      },
      {
        product_id: 2,
        quantity: null,
        package_size: null,
        purchase_price: null,
        warehouse_id: null
      },
      {
        product_id: 2,
        quantity: null,
        package_size: null,
        purchase_price: null,
        warehouse_id: null
      }
    ]

What I am expecting:

我没想到在选择另一个标签后会发生重复,但这是正常的,因为我正在循环抛出它们。

What I have done:

我尝试在循环之前清空我的products_credit,如下所示:

this.form_data.products_credit = []

循环之前。

效果很好,但我不希望这样,因为它会对我的下一步产生副作用。

问题的工作示例:here

最佳答案

您可以在添加之前检查您的数组是否已包含您的产品:

watch: {
  search (val) {
    for (let i = 0; i < val.length; i++) {
      if (
        !this.form_data.products_credit.some(item => {
          item.product_id === val[i].id
        })
      ) {
        this.form_data.products_credit.push({
          product_id: val[i].id,
          quantity: null,
          package_size: null,
          purchase_price: null,
          warehouse_id: null
        });
      }
    }
  }
}

但我觉得对于基于用户输入生成的标签数组计算属性的问题有更简单、更快捷的解决方案。如果您能够分享更多您正在做的事情,也许我们可以找到更好的解决方案。

编辑: 看到您的 JSFiddle 后,这里有一个仅使用计算属性( JSFiddle )来处理您的问题的建议:

data: {
  search: [],
  products: [
    {
      id: 1,
      title: "first product",
      category: "first category",
      image: "first_image.jpg",
      barcode: "123123123"
    },
    {
      id: 2,
      title: "second product",
      category: "second category",
      image: "second_image.jpg",
      barcode: "23232323"
    },
  ],
  form_data: {
    category: null,
    products_credit: [],
  }
},
methods: {
    searchProducts (query) {
        //
    }
},
computed : {
  selectedProduct () {
    return this.search.map(item => {
      return {
        product_id: item.id,
        quantity: null,
        package_size: null,
        purchase_price: null,
        warehouse_id: null
      }
    })
  }
}

这是执行此操作的首选方法,因为代码较短,并且没有资源昂贵的观察者。它还同时处理从用户搜索中删除项目。

关于javascript - VueJS 根据 watch 中的键从对象数组中获取唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54333504/

相关文章:

api - Vue 多个 api 包括

javascript - 如何使用 call() 进行继承。错误 : Class constructor cannot be invoked without 'new'

javascript - 未捕获的类型错误 : Illegal invocation javascript

javascript - 如何将可拖动元素返回到选项中?

vue.js - Pdf 在 Electron-Vue 桌面应用程序中不可预览

docker - 在docker-compose之前重新编译VueJS应用

javascript - 三元语句未返回正确的数据

javascript - 如何在 jQuery 中随机删除或删除数组值?

javascript - 在 Vue 中使用 v-for 将行添加到一个表而不是另一个表

javascript - 是 (":hover")仅在 setInterval 函数内工作