Vue indexOf vs vanilla javascript用于从数组中选择对象

Posted

技术标签:

【中文标题】Vue indexOf vs vanilla javascript用于从数组中选择对象【英文标题】:Vue indexOf vs vanilla javascript for selecting an object from an array 【发布时间】:2018-07-15 12:28:06 【问题描述】:

我见过多个例子,在 Vue 中使用 indexOf 从对象数组中选择一个对象,如下所示:

脚本:

new Vue(
  el: '#app',
  data: 
    message: 'Hello Vue.js!',
    items: [
        
        id: 1,
        name: 'test'
      ,
      
        id: 2,
        name: 'hello'
      ,
      
        id: 3,
        name: 'world'
      
    ]
  ,
  methods: 
    deleteItem(item) 
      console.log(this.items.indexOf(item));
      // splice the item.
    
  
)

模板:

<script src="https://unpkg.com/vue"></script>

<div id="app">
  <p> message </p>

  <ul>
    <li v-for="item in items" @click=deleteItem(item)>
       item.name 
    </li>
  </ul>
</div>

https://jsfiddle.net/5gwtyv3h/

现在我想知道这甚至是可能的。如果我进入我的控制台并简单地这样做:

const items = [
    
        id: 1,
        name: 'test'
    ,
    
        id: 2,
        name: 'hello'
    ,
    
        id: 3,
        name: 'world'
    
];

items.indexOf( id: 1, name: 'test');

我得到-1,因为找不到该项目。 Vue 是否正在做一些使这成为可能的事情,还是我在这里遗漏了其他东西?

【问题讨论】:

您的测试总是返回 -1,因为您传递的对象文字不在 items 数组中。对象比较不涉及对象contents;它们基于对象引用。 Difference Between indexOf and findIndex function of array的可能重复 所以它适用于对象引用?我发现在网上很难找到。甚至 Mozilla 页面似乎也没有提到任何关于它的内容:developer.mozilla.org/en-US/docs/Web/javascript/Reference/… @str 您标记为重复的问题没有说明引用或查找对象。 @Stephan-v 答案提到了“原始类型”和“非原始类型(例如对象)”。 【参考方案1】:

您必须缓存添加到 Array 中的对象或进行 deep find()findIndex() 比较。

对于与indexOf比较的Object,它们必须是完全相同的Object,这意味着它们必须引用完全相同的Object实例。

const a = 
    foo: "bar"
  ,
  b = 
    foo: "bar"
  ;

console.log(a === b); // false

考虑一下:

const a = 
    foo: "bar"
  ,
  b = 
    foo: "bar"
  ;

const c = [a, b];

console.log(c.indexOf(
  foo: "bar"
)); // -1 since the Object you **just** made won't be in the array

console.log(c.indexOf(a)); // 0 you're looking for the right object by reference

console.log(c.findIndex(i => i.foo === "bar")); // 0 again since it does a deep compare

// Succinct deep compare using lodash
console.log(_.findIndex(c, i => _.isEqual(i, 
  foo: "bar"
))); // 0 again but deep compare logic is encapsulated
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"&gt;&lt;/script&gt;

【讨论】:

谢谢,我觉得这个解释不够。这部分似乎缺少关于 indexOf 的文档。

以上是关于Vue indexOf vs vanilla javascript用于从数组中选择对象的主要内容,如果未能解决你的问题,请参考以下文章

markdown Vanilla JS vs jQuery

markdown Vanilla JS vs jQuery

markdown Vanilla JS vs jQuery

markdown Vanilla JS vs jQuery

Vue/Vite vanilla 设置上的“TypeError:无法获取动态导入的模块”

我如何将 vanilla Js 代码转换为 vue js 代码