2015-12-20 4 views
2

У меня есть странный вопрос для решения, предположим, вы получаете пару примеров объекта, которые могут быть возвращены:Проверьте объект содержит только один или два элемента Javascript

пример 1:

{name: "something", age: 17, money: 700} 

пример 2:

{age: 17, money: 700} 

пример 3:

{age: 17} // Or 
{money: 700} 

Итак, вот что мне нужно проверить. Если объект имеет только age или money или age и money

Есть ли способ, используя либо lodash или чистый JavaScript (предпочитают lodash), чтобы сказать: вы содержат или содержат или могут содержать и содержать и ничегои ничего больше важен.

ответ

2

Попробуйте с использованием Object.keys(), Array.prototype.every()

var obj1 = { 
 
    name: "something", 
 
    age: 17, 
 
    money: 700 
 
}; 
 

 
var obj2 = { 
 
    age: 17, 
 
    money: 700 
 
} 
 

 
var obj3 = { 
 
    age: 17 
 
    } 
 

 
// Or 
 
var obj4 = { 
 
    money: 700 
 
} 
 

 
var check = function(v) { 
 
    return v === "age" || v === "money" 
 
} 
 

 
var res1 = Object.keys(obj1).every(check); 
 

 
var res2 = Object.keys(obj2).every(check); 
 

 
var res3 = Object.keys(obj3).every(check); 
 

 
var res4 = Object.keys(obj4).every(check); 
 

 
console.log(res1, res2, res3, res4)

jsfiddle https://jsfiddle.net/t6hdkats/3

+0

Что делать, если у него есть оба? У меня также есть это, как требование, это также, просто глядя на него, похоже, не проверяет, являются ли это его ТОЛЬКО ключами. У вас есть Jsbin или скрипка? – TheWebs

+0

ОК, это правильный трек. получить ключи и проверить массив. из двух значений найдено это, а размер массива больше двух, вы знаете, что он получил больше, чем требуемые ключи – Bindrid

+0

@KyleAdams _ «Что делать, если он имеет оба?» _ См. OP в _ «Если только объект имеет возраст ** или ** деньги ** или ** возраст и деньги »_ См. обновленное сообщение – guest271314

1

Javascript не мой самый сильный навык, поэтому я уверен, что это может быть оптимизирована.

var a = {name: "something", age: 17, money: 700}; 

if(Object.keys(a).length == 1 && (a.hasOwnProperty("age") || a.hasOwnProperty("money")) || (Object.keys(a).length == 2 && a.hasOwnProperty("age") && a.hasOwnProperty("money"))) { 
    // yes 
} 
1

Используйте Object.keys(any_obj).length, чтобы получить число keys в объекте.

var x = {name: "something", age: 17, money: 700}; 
var obj = Object.keys(x); 

if((obj.length==2 && x.hasOwnProperty("age") && x.hasOwnProperty("money")) || (obj.length==1 && (x.hasOwnProperty("age") || x.hasOwnProperty("money")))){ 
    // Condition met. 
} 
+0

Использовать hasOwnProperty, иначе x.age = 0 или x.money = 0 завершит этот тест. – esnm

+0

@ChrisGciso 'x = {age: 0};' тогда даже 'x.hasOwnProperty (" age ")' вернет true. – void

+0

@void Это будет, но вашего сравнения не будет! – Areks

0

Ваши требования не очень понятно, но я думаю, что это то, что вы пытаетесь сделать, или вы, возможно, потребуется изменить логику немного, если я не понял ваше требование правильно.

function customTest(obj, list) { 
 
    var keys = Object.keys(obj); 
 
    var uniq = _.unique(list); 
 
    if (!uniq.length || !keys.length && !uniq.length) { 
 
    return true; 
 
    } 
 
    if (!keys.length || keys.length > uniq.length) { 
 
    return false; 
 
    } 
 
    if (keys.length === uniq.length) { 
 
    return _.isEqual(keys, uniq); 
 
    } 
 
    return uniq.some(function(item) { 
 
    return !_.includes(keys, item); 
 
    }); 
 
} 
 

 
var out = document.getElementById('out'); 
 

 
out.textContent += customTest({}, ['age', 'money']) + '\n'; // false 
 

 
out.textContent += customTest({ 
 
    name: "something", 
 
    age: 17, 
 
    money: 700 
 
}, []) + '\n'; // true 
 

 
out.textContent += customTest({ 
 
    name: "something", 
 
    age: 17, 
 
    money: 700 
 
}, ['age', 'money']) + '\n'; // false 
 

 
out.textContent += customTest({ 
 
    name: "something", 
 
    age: 17, 
 
    money: 700 
 
}, ['age', 'age']) + '\n'; // false 
 

 
out.textContent += customTest({ 
 
    age: 17, 
 
}, ['age', 'age']) + '\n'; // true 
 

 
out.textContent += customTest({ 
 
    name: "something", 
 
    age: 17, 
 
    money: 700 
 
}, ['age', 'oranges']) + '\n'; // false 
 

 
out.textContent += customTest({ 
 
    age: 17, 
 
    money: 700 
 
}, ['age', 'money']) + '\n'; // true 
 

 
out.textContent += customTest({ 
 
    age: 17 
 
}, ['age', 'money']) + '\n'; // true 
 

 
out.textContent += customTest({ 
 
    money: 700 
 
}, ['age', 'money']) + '\n'; // true
<script src="https://rawgit.com/lodash/lodash-compat/3.10.1/lodash.min.js"></script> 
 
<pre id="out"></pre>

Вы можете быть в состоянии быть более lodash у, если вы были немного понятнее. И, конечно, вы могли бы использовать _.keys и _.some в приведенном выше вместо Object.keys и Array.prototype.some

Смежные вопросы