Javascript 获取筛选值的对象键
情况很简单——我有一个目标:Javascript 获取筛选值的对象键,javascript,underscore.js,Javascript,Underscore.js,情况很简单——我有一个目标: Object {1: false, 2: true, 3: false, 4: false, 5: false, 6: false, 7: false, 8: true, 12: false, 13: false, 14: false, 15: false, 16: false, 17: false, 18: false, 19: false} 我需要使用下划线获得一个具有真值的ID数组。在上述情况下,这将是: [2, 8] 我试了几次,但有点卡住了。有人知道
Object {1: false, 2: true, 3: false, 4: false, 5: false, 6: false, 7: false, 8: true, 12: false, 13: false, 14: false, 15: false, 16: false, 17: false, 18: false, 19: false}
我需要使用下划线获得一个具有真值的ID数组。在上述情况下,这将是:
[2, 8]
我试了几次,但有点卡住了。有人知道吗
var keys = [];
_.each( obj, function( val, key ) {
if ( val ) {
keys.push(key);
}
});
使用纯下划线可能有更简单/更短的方法
如果此处有人使用下划线代替下划线,也可以使用以下内容,这些内容非常简短且易于阅读:
我不知道
下划线.js
。但是使用普通的JS,我编写了以下代码
function myFunction()
{
var str="1: false; 2: true; 3: false; 4: false; 5: false; 6: false; 7: false; 9: true; 12: false";
var n=str.split(";");
for(var i=0;i<n.length;i++)
{
if(n[i].search("true")!=-1){
alert(n[i].slice(0,n[i].search(":")));
}
}
函数myFunction()
{
var str=“1:false;2:true;3:false;4:false;5:false;6:false;7:false;9:true;12:false”;
var n=str.split(“;”);
对于(var i=0;i您可以尝试以下方法:
_.pairs(obj)
.filter(function(pair) { return pair[1] })
.map(function(pair) { return pair[0] })
或者同样但更简洁一点:
_.pairs(obj).filter(_.last).map(_.first)
你可以很容易地做到
var obj = { a: false, b: false, c: true, d: false, e: true, f: false };
name, names;
name = _.findKey(obj, true);
// -> 'c'
names = _.findKeys(obj, true);
// -> ['c', 'e']
为此,您只需稍微扩展下划线:
_.mixin({
findKey: function(obj, search, context) {
var result,
isFunction = _.isFunction(search);
_.any(obj, function (value, key) {
var match = isFunction ? search.call(context, value, key, obj) : (value === search);
if (match) {
result = key;
return true;
}
});
return result;
},
findKeys: function(obj, search, context) {
var result = [],
isFunction = _.isFunction(search);
_.each(obj, function (value, key) {
var match = isFunction ? search.call(context, value, key, obj) : (value === search);
if (match) {
result.push(key);
}
});
return result;
}
});
您甚至可以使用函数作为过滤器,如下所示:
var team = {
place1: { name: 'john', age: 15 },
place2: { name: 'tim', age: 21 },
place3: { name: 'jamie', age: 31 },
place4: { name: 'dave', age: 17 }}
// Determine the places of players who are major
var placeNames = _.findKeys(team, function(value) { return value.age >= 18; });
// -> ['place2', 'place3']
享受;-)Giorgi Kandelaki给出了一个很好的答案,但也有一些潜在的问题(参见我对他的答案的评论)
正确的方法是:
_(obj).pairs().filter(_.last).map(_.first)
或
另一个可能的解决方案:
// Your example data
var data = {1: false, 2: true, 3: false, 4: false, 5: false, 6: false, 7: false, 8: true, 12: false, 13: false, 14: false, 15: false, 16: false, 17: false, 18: false, 19: false};
// Outputs the keys: ["2", "8"]
_.keys(_.transform(data, function(r, v, k) { v ? r[k] = 1 : null; }));
// Outputs the keys as integers: [2, 8]
_.map(_.keys(_.transform(data, function(r, v, k) { v ? r[k] = 1 : null; })), _.parseInt)
所以基本上:
变换原始对象以去除假值关键帧
从转换的结果中获取关键点列表
如果需要,请将密钥转换为整数
我的版本:
var list = {
1: false, 2: true, 3: false, 4: false,
5: false, 6: false, 7: false, 8: true,
12: false, 13: false, 14: false, 15: false,
16: false, 17: false, 18: false, 19: false
};
_.chain(list).map(function(val, key) {
return val ? parseInt(key) : undefined
}).reject(function(val) {
return _.isUndefined(val);
}).value();
// returns [2,8]
您可以使用reduce:
_(obj).reduce(function(memo, val, key){
if (val)
memo.push(key);
return memo;
}, []);
或链图:
_(obj).chain().map(function(val, key){
if (val)
return key;
}).reject(_.isUndefined).value();
这可能更容易
result = _.chain(obj)
.map(function(value, key){
return value?key:false;
})
.filter(function(v){
return v
})
.value();
我用这个:
使用lodash
例如:
var o = {a: 3, b: 5, c: 3};
var desiredKeys = allKeys(o, 3);
// => [a, c]
您可以使用。
。如下所示:
var data = {1: false, 2: true, 3: false, 4: false, 5: false, 6: false, 7: false, 8: true, 12: false, 13: false, 14: false, 15: false, 16: false, 17: false, 18: false, 19: false}
var keys = _.keys(_.pick(data, function(value) {
return value;
}));
以下是一种在ES6中不使用任何库的方法
let z = {2: true, 3:false, 8:true, 9:false, 10: false}
Array.from(new Set(Object.keys(z).map(function(k){if(z[k]){return k}}))).filter(f=>f)
很不幸,.invert(myObject)
返回对象{false:“19”,true:“8”}
所以它应用了最后一个匹配元素。这不是我想要的。很抱歉,我之前没有看到你的评论。我在JSFIDLE中检查了它,然后意识到了这一点。但是这应该可以。这个版本有问题吗?这真的不是我想要的。我有一个普通对象,不是字符串。@tkoomzaaskz你不能从对象??对不起,我不明白你的意思。我正在寻找一个简短的下划线解决方案,就像我在描述中写的那样。将真实对象转换为字符串表示形式就像将其序列化一样。当然,可以先使用JSON序列化器,然后应用你的解决方案。但是,说真的。究竟为什么要将对象转换为字符串和人我明白了吗?使用真正的表示法更好、维护更友好、更理智。问题还在于下划线解决方案,这不是纯javascript(没有下划线)同样长。我希望有一个我在文档中遗漏的方法…是的,可能没有更短的方法。下划线中没有方法,但您可以通过使用u.extend轻松提供一个。看看我的回答:您可以找到第一个或所有键,并使用函数作为标准。代码中存在一些问题:两个对()和filter()返回数组,而不是下划线对象,因此在调用filter()或map()时结果是,您在本机数组对象上调用了它们。这在现代浏览器中很有效,但如果浏览器不支持array.filter或array.map,则会失败。请参阅我的答案以了解正确的方法。哦,发现得不错。谢谢。我只是快速给出了答案,没有考虑太多浏览器兼容性。小心,transform
doE存在于中,但不存在于中。这是难以置信的过于复杂。什么是复杂的?是否太长而无法编写:name=uj.findKey(obj,true);调用函数并不复杂。扩展下划线来完成它已经可以完成的事情对我来说似乎是一件复杂的事情。这个解决方案对我来说很有效。第二行代码更准确。只需将。最后一个替换为您选择的迭代器函数,瞧!您有一个相当于下划线的语句方法\uuu.findAllKeys
。哦,这是一个很好的解决方案!这个解决方案不起作用。更改[{a:true},{b:false},{c:true},{d:false}]
的数据,然后您将获得[“0”,“1”,“2”,“3”]
或者不使用箭头函数数组。从(新集(Object.keys(z).map(函数(k){if(z[k]){return k})。过滤器(函数)(f) {if(f){return true}})
result = _.chain(obj)
.map(function(value, key){
return value?key:false;
})
.filter(function(v){
return v
})
.value();
var data = {1: false, 2: true, 3: false, 4: true};
var filteredIds = _.filter(_.keys(data), function (key) {
return data[key];
});
// result [2, 4]
var rejectedIds = _.reject(_.keys(data), function (key) {
return data[key];
});
// result [1, 3]
function allKeys(obj, value) {
_.keys(_.pick(obj, function (v, k) { return v === value; }));
}
var o = {a: 3, b: 5, c: 3};
var desiredKeys = allKeys(o, 3);
// => [a, c]
var data = {1: false, 2: true, 3: false, 4: false, 5: false, 6: false, 7: false, 8: true, 12: false, 13: false, 14: false, 15: false, 16: false, 17: false, 18: false, 19: false}
var keys = _.keys(_.pick(data, function(value) {
return value;
}));
let z = {2: true, 3:false, 8:true, 9:false, 10: false}
Array.from(new Set(Object.keys(z).map(function(k){if(z[k]){return k}}))).filter(f=>f)