выберите все ключи объекта, которые начинаются с подчеркивания (_) - PullRequest
5 голосов
/ 16 мая 2019

Мне нужно сделать массив всех ключей (не значений) в следующем объекте, где ключ начинается с подчеркивания _ ...

В следующем фрагменте я пытаюсь получить 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>

Ответы [ 4 ]

9 голосов
/ 16 мая 2019

Вы можете использовать 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);
4 голосов
/ 16 мая 2019

Используйте Object.keys с filter и проверьте, является ли первый символ подчеркиванием _:

let myObj = {
  foo0: 'test',
  _foo1: 'test',
  _foo2: 'test',
  foo3: 'test',
};

const res = Object.keys(myObj).filter(([c]) => c == "_");
console.log(res);
1 голос
/ 16 мая 2019

Попробуйте .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>
1 голос
/ 16 мая 2019

Замените ваш getSubscriptions() следующим образом

 function getSubscriptions(obj, cb) {
        let ret = Object.keys(myObj).filter(ele => ele.startsWith('_'))
        return cb(ret)
    }
  • Object.keys (yourObject): возврат ключей вашего робота.

  • Array.filter (функция): возвращает отфильтрованное значение из массива на основе
    истинное состояние

  • String.startsWith: вернуть true или false, если переданная строка начинается с ( '_')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...