微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将每个函数应用于 forEach javascript

如何解决将每个函数应用于 forEach javascript

那是我的对象标签

tabs: [
    {
      visible: true,title: 'tab 0',products: [{id:1,send: true,delivered: true},{id:1,delivered: true}],},{
      visible: true,title: 'tab 1',products: [{id:11,delivered: false},{id:21,}
  ],
const allDerivered = (product) => product.delivered;
options.tabs.forEach(function (projectProducts){
   if (projectProducts.products.every(allDerivered)){
       statusTabs = 'DELIVERED';
  }
 });

就像第一个产品选项卡都是派生的一样,它不会遍历所有选项卡对象。如何将 allDerived 函数应用于所有选项卡?

解决方法

如果所有标签中的所有产品已交付,我猜您想将statusTabs设置为"DELIVERED",而不是如果任何标签中的任何产品未交付。如果是这样,您可以通过多种方式实现。

您可以使用嵌套的 every 调用:

if (options.tabs.every(({products}) => products.every(({delivered}) => delivered)) {
    statusTabs = "DELIVERED";
}

或带有标签和有向 break 的嵌套循环:

let allDelivered = true;
outer: for (const {products} of options.tabs) {
    for (const {delivered} of products) {
        if (!delivered) {
            allDelivered = false;
            break outer;
        }
    }
}
if (allDelivered) {
    statusTabs = "DELIVERED";
}

如果您还在 false 情况下分配给 statusTabs,那就不那么麻烦了:

statusTabs = "DELIVERED";
outer: for (const {products} of options.tabs) {
    for (const {delivered} of products) {
        if (!delivered) {
            statusTabs = "UNDELIVERED";
            break outer;
        }
    }
}

我将对其余的答案做出这个假设。

我没有在上面使用 allDelivered,因为名称与函数的作用不匹配(它只检查是否有一个产品交付,而不是是否全部交付)并且因为该函数所做的只是对属性值的一次检查,这与内联完成的一样清晰。但是如果你想要一个可重用的函数来做这个检查,你可以有一个:

const isDelivered = ({delivered}) => delivered;

那么上面的两个代码块就是:

if (options.tabs.every(({products}) => products.every(isDelivered)) {
    statusTabs = "DELIVERED";
}

或带有标签和有向 break 的嵌套循环:

statusTabs = "DELIVERED";
outer: for (const {products} of options.tabs) {
    for (const product of products) {
        if (isDelivered(product)) {
            statusTabs = "UNDELIVERED";
            break outer;
        }
    }
}

您可以更进一步,为标签设置 allProductsDelivered 函数:

const allProductsDelivered = ({products}) => products.every(isDelivered);

然后嵌套的 every 将是:

if (options.tabs.every(allProductsDelivered)) {
    statusTabs = "DELIVERED";
}

循环版本将是:

statusTabs = "DELIVERED";
for (const {products} of options.tabs) {
    if (!allProductsDelivered(tab)) {
        statusTabs = "UNDELIVERED";
        break;
    }
}
,

我猜你想要这样的东西:

const tabs = [{
    visible: true,title: 'tab 0',products: [{
      id: 1,send: true,delivered: true
    },{
      id: 1,delivered: true
    }],},{
    visible: true,title: 'tab 1',products: [{
      id: 11,delivered: false
    },{
      id: 21,}
];

const isNotDelivered = (product) => product.delivered == false;

tabs.forEach(tab => {
  const areAllProductsDelivered = !tab.products.find(isNotDelivered);
  if (areAllProductsDelivered) {
    console.log(`${tab.title} is completely delivered`);
  } else {
    console.log(`${tab.title} is NOT completely delivered`);
  }
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。