我正在尝试从Object中检索所有键值,其中键名以(例如_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 包含我需要的值,但我觉得整个代码有点难看。是否有一种清洁的方法来实现这一目标?
答案 0 :(得分:2)
您应该使用reduce同时过滤和减少项目
var obj = {
p1_abc: 1,
p2_abc: 2,
p3_def: 3,
p4_abc: 4,
p5_def: 5
}
var regex = /_abc$/;
var required_values = Object.keys(obj).reduce(function(sum, key) {
if (regex.test(key)) {
sum.push(obj[key]);
}
return sum;
}, []);
console.log(required_values);
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
答案 1 :(得分:2)
首先使用Object.keys()
从对象获取所有属性,然后使用Array.prototype.filter()
过滤数组以获取所需属性,最后使用对象的括号运算符从对象中收集所有值,并使用{返回{ {3}}一个不错的数组。
var obj = { p1_abc: 1, p2_abc: 2, p3_def: 3, p4_abc: 4, p5_def: 5, _abcp6: 6 },
required_values = Object.keys(obj).filter(function (a) {
return /_abc$/.test(a);
}).map(function (a) {
return obj[a];
});
document.write('<pre>' + JSON.stringify(required_values, 0, 4) + '</pre>');
&#13;
答案 2 :(得分:2)
有几分钟的时间,这似乎是一个很好的问题,介绍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
是values
。
'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]);
}
}
答案 3 :(得分:1)
尝试使用for..in
循环RegExp.prototype.test()
与RegExp
/_abc$/
匹配以"_abc"
var obj = {
p1_abc: 1,
p2_abc: 2,
p3_def: 3,
p4_abc: 4,
p5_def: 5
};
for (prop in obj) {
if (/_abc$/.test(prop))
console.log(obj[prop]) // do stuff with `prop` , `obj[prop]`
}
&#13;
答案 4 :(得分:0)
您可以在一个.map()
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 obj[val];
}
});
document.write(required_keys);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
或者如果你想要键/值,你可以这样做
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]:obj[val]};
}
});
document.write(JSON.stringify(required_keys));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
答案 5 :(得分:0)
当您标记Jquery时,您可以使用$.each()
var obj = {p1_abc: 1, p2_abc: 2, p3_def: 3, p4_abc: 4, p5_def: 5}
$.each(obj , function(k , v){
if (k.indexOf("_abc") != -1){
alert(v)
};
})
返回数组
var obj = {p1_abc: 1, p2_abc: 2, p3_def: 3, p4_abc: 4, p5_def: 5}
var requireKeys = [];
$.each(obj , function(k , v){
if (k.indexOf("_abc") != -1){
requireKeys.push(v);
};
})
alert(requireKeys);
答案 6 :(得分:0)
如果您有一个大型数据集,我会赞成“高性能”而不是“干净”。这不是“最干净”的代码,但它会比任何其他解决方案(迄今为止)更高效。
function getValues (obj) {
var values = []
for(var key in obj){
if (key.substr(key.length - 4) === '_abc') {
values.push(obj[key])
}
}
return values
}
答案 7 :(得分:0)
findKey
函数实现。它返回第一个元素谓词的键,返回truthy而不是元素本身。
/**
* @param {Object} collection The collection to inspect.
* @param {Function} predicate The function.
* @returns {*} Returns the key, else `undefined`.
*/
var findKey = function(object, predicate) {
let result;
if (object == null) {
return result;
}
Object.keys(object).some(function(key) {
const value = object[key]
if (predicate(value, key, object)) {
result = key;
return true;
}
})
return result;
}
//Example usage
var collections = {
brand_category_3320: 1133,
brand_category_3321: 2245
};
var r = findKey(collections, function(o, key, context) {
if (key.indexOf(3320) > -1) {
return true;
}
return false;
});
console.log('The r is =', r);
答案 8 :(得分:-1)
obj = {
p1_abc: 1,
p2_abc: 2,
p3_def: 3,
p4_abc: 4,
p5_def: 5
}
required_data = Object.keys(obj).map(function(val, i) {
if (val.indexOf("_abc") != -1)
return {
[val]: obj[val]
};
});
console.log(required_data);
将生成所需的新对象数组,并且可以删除jQuery。