我需要在以下对象中使所有键(而不是值)组成一个数组,其中键以_下划线开头...
在以下代码段中,我试图让getSubscriptions()
返回["_foo1", "_foo2"]
let myObj = {
foo0: 'test',
_foo1: 'test',
_foo2: 'test',
foo3: 'test',
};
function getSubscriptions(obj, cb) {
// should return ["_foo1", "_foo2"]
let ret = ["foo1", "_foo2"];
return cb(ret);
}
getSubscriptions(myObj, (ret) => {
if (match(ret, ["_foo1", "_foo2"]) ) {
$('.nope').hide();
return $('.works').show();
}
$('.nope').show();
$('.works').hide();
});
function match(arr1, arr2) {
if(arr1.length !== arr2.length) { return false; }
for(var i = arr1.length; i--;) {
if(arr1[i] !== arr2[i]) { return false;}
}
return true;
}
body {
background: #333;
color: #4ac388;
padding: 2em;
font-family: monospace;
font-size: 19px;
}
.nope {
color: #ce4242;
}
.container div{
padding: 1em;
border: 3px dotted;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container">
<div class="works">It Works!</div>
<div class="nope">
Doesn't Work...</div>
</div>
答案 0 :(得分:9)
您可以使用Object.keys和Array.filter
let myObj = {
foo0: 'test',
_foo1: 'test',
_foo2: 'test',
foo3: 'test',
};
let result = Object.keys(myObj).filter(v => v.startsWith("_"));
console.log(result);
答案 1 :(得分:4)
将Object.keys
与filter
一起使用,并检查第一个字符是否为下划线_
:
let myObj = {
foo0: 'test',
_foo1: 'test',
_foo2: 'test',
foo3: 'test',
};
const res = Object.keys(myObj).filter(([c]) => c == "_");
console.log(res);
答案 2 :(得分:1)
按如下所示替换您的getSubscriptions()
function getSubscriptions(obj, cb) {
let ret = Object.keys(myObj).filter(ele => ele.startsWith('_'))
return cb(ret)
}
Object.keys(yourObject):返回对象的键。
Array.filter(function):基于
从数组中返回过滤后的值
真实情况
答案 3 :(得分:1)
在过滤器中尝试.startsWith("_")
。
let myObj = {
foo0: 'test',
_foo1: 'test',
_foo2: 'test',
foo3: 'test',
};
function getSubscriptions(obj, cb) {
// should return ["_foo1", "_foo2"]
let ret = Object.keys(myObj).filter(v => v.startsWith("_"));
return cb(ret);
}
getSubscriptions(myObj, (ret) => {
if (match(ret, ["_foo1", "_foo2"]) ) {
$('.nope').hide();
$('.works').show();
}
// $('.nope').show(); // you have misplaced these 2 lines
//$('.works').hide();
});
function match(arr1, arr2) {
if(arr1.length !== arr2.length) { return false; }
for(var i = arr1.length; i--;) {
if(arr1[i] !== arr2[i]) { return false;}
}
return true;
}
body {
background: #333;
color: #4ac388;
padding: 2em;
font-family: monospace;
font-size: 19px;
}
.nope {
color: #ce4242;
}
.container div{
padding: 1em;
border: 3px dotted;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container">
<div class="works">It Works!</div>
<div class="nope">
Doesn't Work...</div>
</div>