2016-09-29 2 views
0

Мне интересно, почему мое решение не работает. У меня есть следующие:Если инструкция, которая проверяет несколько тернарных операторов Javascript

//tells if type should be included in the row data 
isInReport = {factual: true, eac: false, variance: false} 

//report has hundreds of objects, each with a type of either Plan, Factual, EAC, Variance 
report = [{type: "Plan"}, {type: "Factual"}, {type: "EAC"}, {type: "Variance"}]; 

мне нужно перебрать массив отчетов и сделать что-то всегда, если item.type это «план», или, если это один из других 3-х типов, но только если это true в объекте isInReport. Поэтому в моем примере оператор if должен пройти, если item.type является «Plan» или «Factual»

Почему этот код не работает? Логика кажется мне правдой, даже немного странной. Когда я тестировал, он всегда возвращает все типы независимо от того, что. Спасибо за любую помощь!

report.map(function (item) { 
    if (
    item.type === "Plan" || 
    item.type === (isInReport.factual) ? "Factual" : "Plan" || 
    item.type === (isInReport.eac) ? "EAC" : "Plan" || 
    item.type === (isInReport.variance) ? "Variance" : "Plan" 
) { 
    //do stuff 
    } 
}); 
+0

Возможно, вам нужен 'report.filter 'вместо или в дополнение? – apokryfos

+0

Вы можете перепроверить, если строка 'report = [{type:" Plan "} {type:" Factual "} {type:" EAC "} {type:" Variance "}];' is correct? Множество запятых, кажется, отсутствует, например: 'report = [{type:" Plan "}, {type:" Factual "}, {type:" EAC "}, {type:" Variance "}];' Кроме того, можете ли вы подтвердить, что 'item.type ===" Plan "' selding true, [больше не требуется никаких проверок, поскольку утверждение уже истинно-ish] (https://developer.mozilla.org/en/docs/Glossary/Truthy) – Bonatti

+0

Не знаете, каков ваш вопрос здесь, так или иначе, даже этот код работает, если вы можете его изменить, должно быть хорошо изменить его в форме, которая очень читаема. Вам не нужен тройной оператор внутри условия * if *! –

ответ

1

ли вы хотите сделать:

if (item.type === "Plan" || isInReport[ item.type.toLowerCase() ]) { 
    //do stuff 
} 

Существует комментарий предполагая это не правильно. Можете ли вы подтвердить, что вы ожидаете в результате для 4 пунктов в report?

//tells if type should be included in the row data 
 
isInReport = {factual: true, eac: false, variance: false} 
 

 
//report has hundreds of objects, each with a type of either Plan, Factual, EAC, Variance 
 
report = [{type: "Plan"}, {type: "Factual"}, {type: "EAC"}, {type: "Variance"}]; 
 

 
report.forEach(function(item){ 
 
    if (item.type === "Plan" || isInReport[ item.type.toLowerCase() ]) { 
 
    console.log("Item Type:" + item.type + " PASSED TEST"); 
 
    } else { 
 
    console.log("Item Type:" + item.type + " FAILED TEST"); 
 
    } 
 
});

Если вы хотите, чтобы придерживаться пути вы начали, то вы хотите использовать некоторые скобки, чтобы лучше контролировать порядок или opperations.

//tells if type should be included in the row data 
 
isInReport = {factual: true, eac: false, variance: false} 
 

 
//report has hundreds of objects, each with a type of either Plan, Factual, EAC, Variance 
 
report = [{type: "Plan"}, {type: "Factual"}, {type: "EAC"}, {type: "Variance"}]; 
 

 
report.forEach(function(item){ 
 
    if (
 
    item.type === "Plan" || 
 
    item.type === (isInReport.factual ? "Factual" : "Plan") || 
 
    item.type === (isInReport.eac ? "EAC" : "Plan") || 
 
    item.type === (isInReport.variance ? "Variance" : "Plan") 
 
) { 
 
    console.log("Item Type:" + item.type + " PASSED TEST"); 
 
    } else { 
 
    console.log("Item Type:" + item.type + " FAILED TEST"); 
 
    } 
 
});

+0

Не похоже, что это вопрос, нет; каждый тип в 'isInReport' коррелирует с двумя разными строковыми значениями, разрешенными в' item.type'. –

+0

@DaveNewton Какой прецедент не подходит? – JonSG

+0

Спасибо, это работает, оно должно проходить только для «Плана» и «Фактического», так как «план» всегда проходит, а фактический «истинный» в объекте isInReport – AnotherMike

0

Я не вижу ошибку ... я скрипка его здесь: http://jsfiddle.net/Lnkky0fw/

$(document).ready(function() { 
var isInReport = {factual: true, eac: false, variance: false}; 

//report has hundreds of objects, each with a type of either Plan, Factual, EAC, Variance 
var report = [{type: "Plan"},{type: "Factual"},{type: "EAC"},{type: "Variance"}]; 

report.map(function (item) { 
    if (
    item.type === "Plan" || 
    item.type === (isInReport.factual) ? "Factual" : "Plan" || 
    item.type === (isInReport.eac) ? "EAC" : "Plan" || 
    item.type === (isInReport.variance) ? "Variance" : "Plan" 
) { 
    //do stuff 
    alert('ok'); 

    } 
}); 
}); 
+0

Да, это то, что я получаю. Он должен только оповещать об элементе.type === «Plan» и «Factual», но он предупреждает обо всех 4 типах. – AnotherMike

+0

Humm кажется, что вам нужно организовать ваш оператор IF следующим образом: if ( (item.type === "Plan") || (item.type === ((isInReport.factual)? "Фактический" : «План»)) || (item.type === ((isInReport.eac)? «EAC»: «План»)) || (item.type === ((isInReport.variance)? " Разница »:« План »)) ) { http://jsfiddle.net/6mp0b1wm/ –

0

Вы отсутствуете запятые между элементами в массиве «отчет».

+0

Довольно уверен, что это опечатка, сделанная при уменьшении исходного исходного кода до управляемого размера. –

+0

исправлено, спасибо – AnotherMike

0

Я бы создать массив допустимых значений, а затем использовать фильтр. Это облегчит чтение и поддержку, чем многократная вложенная, если/тройная смесь.

var isInReport = { 
 
    factual: true, 
 
    eac: false, 
 
    variance: false 
 
}; 
 

 
var report = [{ type: "Plan" }, { type: "Factual" }, { type: "EAC" }, { type: "Variance" }]; 
 

 
var allowed = ["plan"] 
 
    .concat(Object.keys(isInReport) 
 
    .map(function (key) { 
 
     if (isInReport[key]) return key.toLowerCase(); 
 
    }).filter(function (v) { 
 
     return v; 
 
    }) 
 
); 
 

 
var filtered = report.filter(function (d) { 
 
    if (allowed.indexOf(d.type.toLowerCase()) > -1) return true; 
 
    return false; 
 
}); 
 

 
console.log(filtered);

+0

Это действительно интересный способ сделать это, и, используя функциональные методы, я думаю, что это сработает, никогда не думало делать так – AnotherMike

0

Вы должны приложить тройные выражения в скобках, чтобы получить ожидаемый результат

if (
    item.type === "Plan" || 
    item.type === ((isInReport.factual) ? "Factual" : "Plan") || 
    item.type === ((isInReport.eac) ? "EAC" : "Plan") || 
    item.type === ((isInReport.variance) ? "Variance" : "Plan") 
) 

(и вы забыли запятые в

report = [{type: "Plan"},{type: "Factual"},{type: "EAC"},{type: "Variance"}];)

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