Проверка правильности данных объекта и получение соответствующих данных, если это так - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть проблема, чтобы решить, используя некоторые данные из объекта.Данные могут принимать несколько форм и могут существовать или не существовать в первую очередь.Например,

things : {
   oranges: true,
   apples : false
}

, но это может быть равно:

things : {
   oranges: false,
   apples : false
}

или, может быть, things даже не существует

Мне нужно:

1) Определить, что things существует

2) Определить, что things содержит дополнительные ключи

Эти два оператора необходимо проверить в одной вызываемой функции, например, thingsHasData()

3) Если у things есть данные, установлен ли какой-либо из данных на true?

Это также должна быть вызываемая функция, например fruitsIsTrue()

4)Вернуть ключ для одного из истинных значений

trueFruit() - это должно вернуть только один ключ, но не имеет значения, какой (у него не должно быть двух истинных значений согласно бизнес-правиламно это скорее запасной вариант - просто вернуть его, если по какой-то причине это так)

Итак, я смог получить ключ пары ключ-значение true, используя следующее:

var thingsList = {
    things : {
           oranges: false,
           apples : true
        }
    }
var trueFruit = Object.keys(thingsList).filter(function(key) {
    return thingsList[key];
});

return thingsList[0];

Это правильно возвращает apples и только яблоки, так что это работает для точки 4 , но не другие, и я чувствую, что есть лучшеспособ сделать это, не полагаясь на повторение одного и того же .filter в нескольких различных функциях.Идеи?

Ответы [ 4 ]

0 голосов
/ 27 ноября 2018
const thingsHasData = arg => (arg.things && Object.keys(arg.things).length>0) ? true : false;
const trueFruit = arg => {
    if (!arg.things) return;
    let fruitIndex = null;
    let fruitValues = Object.values(arg.things);
    fruitValues.forEach((value, index) => {
        if (value) fruitIndex = Object.keys(arg.things)[index];
    });
    return fruitIndex;
}
0 голосов
/ 27 ноября 2018

Вы можете использовать функции и для значения true используйте Array#find.

function thingsHasData(object) {
    return 'things' in object;
}

function fruitsIsTrue(object) {
    return 'things' in object && Object.values(object.things).some(Boolean);
}

function trueFruit(object) {
    return 'things' in object && Object.keys(object.things).find(k => object.things[k]);
}

var a = {},
    b = { things: {} },
    c = { things: { oranges: true, apples : false } },
    d = { things: { oranges: false, apples : false } };

[a, b, c, d].forEach(o => console.log(
    thingsHasData(o),
    fruitsIsTrue(o),
    trueFruit(o)
));
0 голосов
/ 27 ноября 2018

var thingsList = {
    things : {
        oranges: false,
        apples : true
    },
    things2 : {
        oranges: true,
        apples : true
    }
};

function validateThings(things) {
    // (1) checks for a falsy value of things
    if (!things) {
        return false;
    }
    var keys = Object.keys(things);
    // (2) checks if things has keys
    if (!keys.length) {
        return false;
    }
    // (3) then it checks for every single keys value if it is truthy
    for (var i = 0, len = keys.length; i < len; i++ ) {
        if (things[keys[i]]) {
            // (4) return this value — all tests passed
            return things[keys[i]];
        }
    }
    return false;
}

console.log(validateThings(thingsList.notInList));
console.log(validateThings(thingsList.things));
console.log(validateThings(thingsList.things2));
0 голосов
/ 27 ноября 2018

Чтобы проверить, существует ли Объект things, вы можете использовать следующий код:

if (typeof things != "undefined") {
    // It exists!
}

Чтобы проверить, есть ли у объекта дочерние элементы, отметьте Object.keys(things).length > 0.

проверка для 1) и 2) будет выглядеть так:

let things = {
   oranges: true,
   apples: false
}

if (typeof things != "undefined") {
    // It exists!
    if (Object.keys(things).length > 0) {
        // It has children!
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...