我正在尝试从对象中检索所有键值,其中键名称以(比如 _abc)结尾。
我的尝试
obj = {p1_abc: 1, p2_abc: 2, p3_def: 3, p4_abc: 4, p5_def: 5}
required_keys = jQuery.map(Object.keys(obj), function(val, i){
if(val.indexOf("_abc") != -1)
return val;
});
//required_keys = ['p1_abc', 'p2_abc', 'p4_abc']
required_values = jQuery.map(required_keys, function(v, i){
return(obj[v]);
});
//required_values = [1, 2, 4]
这里,required_values 包含我需要的值,但我觉得整个代码有点难看。有没有一种干净的方法可以实现这一点?
最佳答案
有几分钟的空闲时间,这似乎是一个很好的问题来介绍iterators
以下是一个用 ES5 编写的示例,但它也可以在加载垫片的 ES3 中工作。
function makeEntriesIterator(object) {
var keys = Object.keys(object);
var nextKey = 0;
return {
next: function next() {
if (nextKey < keys.length) {
var key = keys[nextKey];
var iterator = {
value: [key, object[key]],
done: false
};
nextKey += 1;
return iterator;
}
return {
value: undefined,
done: true
};
}
};
}
var obj = {
p1_abc: 1,
p2_abc: 2,
p3_def: 3,
p4_abc: 4,
p5_def: 5
};
var iterator = makeEntriesIterator(obj);
var next = iterator.next();
var matches = [];
while (!next.done) {
if (next.value[0].slice(-4) === '_abc') {
matches.push(next.value);
}
next = iterator.next();
}
document.getElementById('out').textContent = JSON.stringify(matches, null, 2);
console.log(matches);
<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.4.1/es5-shim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/json3/3.3.2/json3.min.js"></script>
<pre id="out"></pre>
在 ES6 中,你可以使用 for..of
而不是 while
和数组有迭代器 values
, entries
和 keys
, 默认 Symbol.iterator
是值
。
'use strict';
const obj = {
p1_abc: 1,
p2_abc: 2,
p3_def: 3,
p4_abc: 4,
p5_def: 5
};
const matches = [];
for (let key of Object.keys(obj)) {
if (key.endsWith('_abc')) {
matches.push([key, obj[key]]);
}
}
document.getElementById('out').textContent = JSON.stringify(matches, null, 2);
console.log(matches);
<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.4.1/es5-shim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/json3/3.3.2/json3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.34.0/es6-shim.js"></script>
<pre id="out"></pre>
ES7将为对象引入迭代器,例如entries
然后事情变得更加清晰,因为您将不需要使用 Object.keys
。但是现在还不能证明这一点。
'use strict';
const obj = {
p1_abc: 1,
p2_abc: 2,
p3_def: 3,
p4_abc: 4,
p5_def: 5
};
const matches = [];
for (let [key, value] of obj) {
if (key.endsWith('_abc')) {
matches.push([key, value]);
}
}
关于javascript - 从键以特定模式结尾的对象中获取所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34488829/