这是我的对象选项卡:
tabs: [
    {
      visible: true,
      title: 'tab 0',
      products: [{id:1, send: true, delivered: true}, {id:1, send: true, delivered: true}],
    },
    {
      visible: true,
      title: 'tab 1',
      products: [{id:11, send: true, delivered: false}, {id:21, send: true, delivered: true}],
    }
  ],const allDerivered = (product) => product.delivered;options.tabs.forEach(function (projectProducts){
   if (projectProducts.products.every(allDerivered)){
       statusTabs = 'DELIVERED';
  }
 });与第一个products选项卡一样,它也是allDerivered,它不会遍历所有的tabs对象。如何将allDerivered函数应用于所有选项卡?
发布于 2021-02-03 18:23:25
我猜想,如果中的所有产品都已交付,而中的任何产品<>E29>选项卡未交付,则您希望将设置为"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";
}如果你在错误的情况下也赋值给statusTabs,这就不那么麻烦了:
statusTabs = "DELIVERED";
outer: for (const {products} of options.tabs) {
    for (const {delivered} of products) {
        if (!delivered) {
            statusTabs = "UNDELIVERED";
            break outer;
        }
    }
}我将在接下来的回答中做这个假设。
我在上面没有使用allDelivered,因为名称与函数的功能不匹配(它只检查one产品是否已交付,而不是所有产品是否都已交付),而且函数所做的只是对属性值的一次检查,这一点在内联完成时同样清晰。但是如果你想要一个可重用的函数来做这个检查,你可以有一个:
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;
    }
}发布于 2021-02-03 18:25:18
我猜你想要这样的东西:
const tabs = [{
    visible: true,
    title: 'tab 0',
    products: [{
      id: 1,
      send: true,
      delivered: true
    }, {
      id: 1,
      send: true,
      delivered: true
    }],
  },
  {
    visible: true,
    title: 'tab 1',
    products: [{
      id: 11,
      send: true,
      delivered: false
    }, {
      id: 21,
      send: true,
      delivered: true
    }],
  }
];
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`);
  }
});
https://stackoverflow.com/questions/66025393
复制相似问题