Проверяющие, если данные объекта является «истинным» и получение соответствующих данных, если так

голоса
0

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

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в нескольких различных функций. Идеи?

Задан 27/11/2018 в 15:05
источник пользователем
На других языках...                            


4 ответов

голоса
1
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;
}
Ответил 27/11/2018 в 15:59
источник пользователем

голоса
1

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));

Ответил 27/11/2018 в 15:21
источник пользователем

голоса
1

Вы можете взять функции и для 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)
));

Ответил 27/11/2018 в 15:20
источник пользователем

голоса
0

Для того, чтобы проверить , если объект 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!
    }
}
Ответил 27/11/2018 в 15:14
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more