结合 $ 和 _ 以按数据值提取?

Combine $ and _ to pluck by data values?

我有一个包含 jquery 个具有数据属性的元素的列表。

现在我想获得这些数据属性的列表。

由于 data 属性是某种对象 属性,我认为这可能适用于下划线 pluck 方法。

这可能吗?

看这个简短的例子:

var divs = $("div");

// now do something

// expected result: [1, 2, 3]
<script src="https://cdnjs.com/libraries/underscore.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<div data-foo="1">a</div>
<div data-foo="2">b</div>
<div data-foo="3">c</div>
<div>x</div>

解决方案

基于@romeo-sierra,这是我写下来的方式(因为我已经有 jquery 个对象)。下划线是多余的

var foos = $("div").map(function() {
  return $(this).data("foo");
}).toArray();

console.log(foos);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div data-foo="1">a</div>
<div data-foo="2">b</div>
<div data-foo="3">c</div>
<div>x</div>

Vanilla JS 可以很好地实现这一点,不需要 jQuery 也不需要任何其他库:

const foos = [...document.querySelectorAll('[data-foo]')]
  .map(elm => elm.dataset.foo);
console.log(foos);
<div data-foo="1">a</div>
<div data-foo="2">b</div>
<div data-foo="3">c</div>
<div>x</div>

ES5 版本:

var foos = Array.prototype.map.call(document.querySelectorAll('[data-foo]'), function(elm) {
  return elm.dataset.foo;
});
console.log(foos);
<div data-foo="1">a</div>
<div data-foo="2">b</div>
<div data-foo="3">c</div>
<div>x</div>

以下使用纯 jQuery 的情况如何? (因为您已经在使用它)

var arr = [];
$('div[data-foo]').each(function(){
    arr.push($(this).data("foo")); // should return the value
});
console.log(arr);

检查 this fiddle

绝对必须查找特定的数据属性。

您不能只为元素数据属性耗尽整个页面并获得这样的完整列表。

但是如果你知道你在寻找什么... 见下文

var attribute = "foormidable";

$("*").each(function(){
  var match = $(this).attr("data-"+attribute);
  if(typeof(match)!="undefined"){
    console.log(match);
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div data-foorm="1">a</div>
<div data-foormidable="2">b</div>
<div data-foolahlayouuu="3">c</div>
<div>x</div>

使用 .data()

var attribute = "foormidable";

$("*").each(function(){
  var match = $(this).data(attribute);
  if(typeof(match)!="undefined"){
    console.log(match);
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div data-foorm="1">a</div>
<div data-foormidable="2">b</div>
<div data-foolahlayouuu="3">c</div>
<div>x</div>

最后一个将获得 THE OBJECT 的值...通过 JS 代码是动态的。
这与 load 标记属性值真正不同。
;)