【问题标题】:How to add new properties into every object of an array如何将新属性添加到数组的每个对象中
【发布时间】:2020-07-26 17:19:27
【问题描述】:

如何在对象数组中添加新的 2 个属性?应该为数组中的每个对象添加这两个属性。这是函数:

selectTag(selectedProduct, selectedTag) {
      this.selectedProducts.filter(item => {
        item.id === selectedProduct.id
      })
      .map(item => {
        item.tagId=selectedTag.id, item.tagTitle = selectedTag.title
        })
    },

下拉菜单

  <b-dropdown aria-role="list">
                <b-button
                  icon-right="caret-down"
                  class="ToolbarButton"
                  size="is-small"
                >
                  <span> {{ selectedProduct.tagTitle }} </span>
                </b-button>

                <b-dropdownitem
                  v-for="selectedTag in selectedProduct.tags"
                  :key="selectedTag.id"
                  aria-role="listitem"
                  @click="selectTag(selectedProduct, selectedTag)"
                >
                  {{ selectedTag.title }}
                </b-dropdownItem>

我尝试了上面的功能,但是没有用。地图方法应该是固定的。我正在尝试添加 tagId 和 tagTitle 属性,这些属性将从每个产品行的下拉选择中获取值...如何修复?

【问题讨论】:

标签: javascript ecmascript-6 vuejs2 javascript-objects ecmascript-5


【解决方案1】:

map函数确实错了,你什么都不返回,应该是这样的:

.map(item => ({
     ...item,
     tagId: selectedTag.id,
     tagTitle: selectedTag.title
}))

.map(item => {
  return {
    ...item,
    tagId: selectedTag.id,
    tagTitle: selectedTag.title
  }
})

【讨论】:

  • 这只会返回一个具有这两个属性的数组,必须在这个对象中添加...item 才能返回完整的对象
  • 是的,完全忘记了
  • 是的,很好,你在我写完评论后一秒钟就更新了哈哈
  • 目标是改变 selectedProducts。这段代码不会创建一个新数组,但保持 selectedProducts 不变?
【解决方案2】:

您可以在对象上循环并添加您的属性:

for(let obj of array) {
    obj[key1] = value1;
    obj[key2] = value2;
}

【讨论】:

    【解决方案3】:

    如果这是在 Vue.js 中,您不能按惯例向对象添加属性,因为它不会是反应式的。你需要使用 Vue.set:

        selectTag: function(selectedProduct, selectedTag) {
          for (var i = 0; i < this.selectedProducts.length; i++) {
            if (this.selectedProducts[i].id === selectedProduct.id) {
              this.$set(this.selectedProducts[i], "tagId", selectedTag.id);
              this.$set(this.selectedProducts[i], "tagTitle", selectedTag.title);
            }
          }
        }
    

    【讨论】:

    • 您能否根据我的整个问题代码编辑您的答案?我首先对 selectedProduct 进行 id 检查,然后再添加值
    • 表示vue未定义,tagId未定义,tagTitle未定义
    • 我错过了一个报价。请立即尝试。另外,请看这里:vuejs.org/v2/guide/reactivity.html
    • 如果我正确理解了这个问题,我相信这应该可以工作了。假设 selectedProducts 是在组件中使用 selectTag 方法定义的。
    • '已经用它被使用的下拉部分更新了我的问题。它仍然无法正常工作。您能否检查问题中的下拉部分以更好地理解该问题?过滤器部分工作正常控制台日志显示正确的 ID,但第二部分在每个内部都不起作用
    【解决方案4】:

    试试这个

    var arr =[
    {id: 1, turnName: "10_00_am"},
    {id: 2, turnName: "10_00_am"},
    {id: 3, turnName: "11_00_am"}
    ];
    
    
    const addProps = (x) => {
        x.prop1 = 'Alaska';
        x.prop2 = 'Canada';
        return x;
    }
    
    var newArr = arr.map(x => addProps(x));
    console.log(newArr);

    【讨论】:

      【解决方案5】:

      从您展示的函数中,指出过滤器需要将其结果存储在某个变量中,因为过滤器不会改变执行它的数组。映射不起作用,因为您必须复制对象然后扩展新属性

      如果我正确理解了您的问题,请尝试以下示例

      const object = {
        selectTag(selectedProduct, selectedTag) {
          const data = this.selectedProducts.filter((item) => {
            item.id === selectedProduct.id;
          });
      
          return data.map((entry) => ({
            ...entry,
            tagId: selectedTag.id,
            tagTitle: selectedTag.title,
          }));
        },
      };
      

      【讨论】:

        【解决方案6】:

        .map 与对象扩展语法一起使用。

        .map(item => ({
            ...item, 
            item.tagId: selectedTag.id, item.tagTitle: selectedTag.title
        }))
        

        【讨论】:

          【解决方案7】:

          您可以使用 ES6 对象扩展语法从 map 函数返回一个新的更新项。 此外,对象属性可以在函数参数本身中进行解构,使其看起来简洁明了。

          selectTag(({id}), ({id: tagId, title: tagTitle})) {
              this.selectedProducts.filter(item => item.id === id)
              .map(item => ({...item, tagId, tagTitle}))
          }
          

          【讨论】:

          • 请为您的答案添加扩展,以获得长期价值,并供未来的访问者学习。仅代码的答案不太可能获得支持,因为它们没有帮助或用户友好。
          猜你喜欢
          • 2020-12-16
          • 2022-01-18
          • 2020-07-07
          • 2019-08-21
          • 1970-01-01
          • 2021-03-22
          • 2016-11-27
          • 2017-10-13
          相关资源
          最近更新 更多