当前位置: 首页 > 面试题库 >

如何过滤对象的javascript数组

裴哲
2023-03-14
问题内容

我有两个阵列。我正在用PubSidebar过滤基于groupKey。

let groupKey = ['oaDeal', 'Journals', 'Deposit']

   // This array of object will be filtering with groupKey

const PubSidebar = [

  {

    value: 'Dashboard',

    role: 'public',

  },

  {

    value: 'oaDeal',

    role: 'private',

    content: [

      {

        role: 'private',

        value: 'oaDeal',

      },

    ],

  },

  {

    value: 'Journals',

    role: 'public',

    content: [

      {

        role: 'private',

        value: 'Journals',

      },

      {

        role: 'private',

        value: 'Token',

      },

      {

        role: 'private',

        value: 'policy',

      },

      {

        role: 'private',

        value: 'Deposit',

      },

      { role: 'public', value: 'test' },

    ],

  },

]

// Here is my trying code. I am filtering PubSidebar

const res = PubSidebar.filter(x => {

  // when it's main outerloop role public or private and groupKey matched

  if (

    x.role === 'public' ||

    (x.role === 'private' && groupKey.includes(x.value))

  ) {

    // then if inner-array exist then inner array filtering

    if (x.content) {

      // inside content assign condition public or private and groupKey

      let tempX = x.content.filter(

        y =>

          y.role === 'public' ||

          (y.role === 'private' && groupKey.includes(y.value)) ||

          x.value === y.value

      )

      x.content = tempX

      console.log(tempX)

      return x

    } else {

      // Other wise give me a single object public

      console.log(x)

      return x

    }

  }







})

如果父母重视:日记或存款或任何价值或角色:公共,我在传递内容数组内的对象时遇到问题。我必须在基于的内容数组中传递值groupKey

如果存在Journals and Deposits,则在内容数组内添加Journals and Deposit数据,包括公共数据。(三个对象)

如果存在Journals,则将Contents数组内的Journals数据添加到公共数据(两个对象)中如果存在Deposits,则将Contents数组内包含公共数据的Deposits数据添加到两个公共对象中

如果GroupKey日记与pubsidebar中的content对象匹配,则有两个对象,我们将得到

{
    value: 'Journals',
    role: 'public',
    content: [
      {
        role: 'private',
        value: 'Journals',
      },
      { role: 'public', value: 'test' },
    ],
  }

如果GroupKey存款与pubsidebar中的内容对象匹配,则两个对象

{
    value: 'Deposit',
    role: 'public',
    content: [
      {
        role: 'private',
        value: 'Deposit',
      },
      { role: 'public', value: 'test' },
    ],
  }

如果GroupKey Journals和Deposits与pubsidebar中的content对象匹配,则三个对象,

    {
        value: 'Deposit' || "Journals",
        role: 'public',
        content: [
{
            role: 'private',
            value: 'Journals',
          },
          {
            role: 'private',
            value: 'Deposit',
          },
          { role: 'public', value: 'test' },
        ],
      }

问题答案:

如果我理解正确,则想过滤PubSidebar。如果值具有公共作用或groupKey中包含的值,则保留这些值。如果是这样,这将是您的功能

PubSidebar.filter(x => (x.role === 'public' || groupKey.includes(x.value));

如果您也想在内容上运行它,我们可以将其拆开:

const filterByGroup = (x) => (x.role === 'public' || groupKey.includes(x.value));

let result = [];
for (let i = 0; i < PubSidebar.length; i++) {
  const item = PubSidebar[i];

  if (filterByGroup(item)) {
    if (item.content) {
      item.content = item.content.filter(filterByGroup);
    }
    result = [ ...result, item ];
  }
}

片段:

let groupKey = ['oaDeal', 'Journals', 'Deposit']

const PubSidebar = [{

    value: 'Dashboard',

    role: 'public',

  },

  {

    value: 'oaDeal',

    role: 'private',

    content: [{

      role: 'private',

      value: 'oaDeal',

    }, ],

  },

  {

    value: 'Journals',

    role: 'public',

    content: [{

        role: 'private',

        value: 'Journals',

      },

      {

        role: 'private',

        value: 'Token',

      },

      {

        role: 'private',

        value: 'policy',

      },

      {

        role: 'private',

        value: 'Deposit',

      },

      {

        role: 'public',

        value: 'test'

      },

    ],

  },

]



const filterByGroup = (x) => (x.role === 'public' || groupKey.includes(x.value));



let result = [];

for (let i = 0; i < PubSidebar.length; i++) {

  const item = PubSidebar[i];



  if (filterByGroup(item)) {

    if (item.content) {

      item.content = item.content.filter(filterByGroup);

    }

    result = [...result, item];

  }

}

console.log(result);


 类似资料:
  • 问题内容: 我有一系列对象,我想知道搜索它的最佳方法。给定以下示例,我如何搜索和?jQuery有什么可以帮助的吗?还是我必须自己蛮力搜​​索? 问题答案: 您可以使用:

  • 我有这个对象,我需要过滤它。 我只需要在“数据”中输入“isEnabled”为真的值的ID

  • 问题内容: 我有以下JavaScript数组的房地产主页对象: 我想做的是能够对对象执行过滤,以返回“家庭”对象的子集。 例如,我想根据能够过滤:,,,和。 如何在JavaScript中执行类似下面的伪代码的操作: 注意,语法不必与上面完全相同。这只是一个例子。 问题答案: 您可以使用以下方法: 现场示例: 此方法是新ECMAScript 5th Edition标准的一部分,几乎可以在所有现代浏览

  • 问题内容: 我有两个对象数组。我想基于PermissionObj过滤数据。 这是即将形成的数据库。这是permissionObj中的子数组的数组。 这是静态数据。我想比较基于PermissionObj的数据。 我正在尝试基于 对象 的 PermissionObj数组 过滤 对象 的 数据数组 。这是我尝试的代码。 如果PermissionObj值将与data值匹配。然后显示数据。 我接受的输出将是

  • 根据条件过滤一个对象数组,同时过滤掉未指定的键(key)。 使用 Array.filter() 根据断言 fn 过滤数组,以便返回条件为真值(truthy)的对象。 在过滤出来的数组上,使用 Array.map() 和 Array.reduce() 返回新的对象来过滤掉 keys 参数中未提供的键。 const reducedFilter = (data, keys, fn) => data.

  • 问题内容: 我在javascript中有一组对象。内容看起来像这样; 我想保留一些对象并删除其余的对象。如果object属性为2或34,则将保留对象。其他对象被删除。遗嘱的结果看起来像这样; 我正在使用node.js v6.91。 编辑:有人建议我使用过滤器来解决这种问题。欢迎使用过滤器技术的答案。 问题答案: 您可以尝试以下方法1和2: 方法1 :(使用) 注意:这将返回一个新数组,并且不会修改