Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象动态键值的过滤器对象_Javascript_Lodash - Fatal编程技术网

Javascript 对象动态键值的过滤器对象

Javascript 对象动态键值的过滤器对象,javascript,lodash,Javascript,Lodash,如何在javaScript或lodash中过滤具有动态键值的对象中的对象 我的数据是: var names = [ { name: 'c1', tags: { key1: 'value1-1', key2: 'value1-2', }, }, { name: 'c2', tags: { key1: 'value2-1', key2: 'value1-2', }, }, {

如何在javaScript或lodash中过滤具有动态键值的对象中的对象

我的数据是:

var names = [
  {
    name: 'c1',
    tags: {
      key1: 'value1-1',
      key2: 'value1-2',
    },
  },
  {
    name: 'c2',
    tags: {
      key1: 'value2-1',
      key2: 'value1-2',
    },
  },
  {
    name: 'c3',
    tags: {
      key3: 'value3-1',
      key4: 'value3-2',
    },
  }
]
过滤数据为:

var filterData = {
  key3: { 0: 'value3-1' },
  key4: { 0: 'value3-2' }
}
我希望过滤器和过滤器后显示如下:

afterFilter = [
      {
        name: 'c3',
        tags: {
          key3: 'value3-1',
          key4: 'value3-2',
        }
      }
    ]

第一个console.log段:
-过滤器在标记中包含键/VAL
第二个console.log段:
-完全相同的一组键/VAL(还检查它们的长度是否相同)

var名称=[{
名称:“c1”,
标签:{
键1:‘值1-1’,
键2:‘值1-2’,
},
},
{
名称:“c2”,
标签:{
键1:‘值2-1’,
键2:‘值1-2’,
},
},
{
名称:“c3”,
标签:{
键3:‘值3-1’,
键4:‘值3-2’,
},
}
]
变量filterData={
键3:‘值3-1’,
键4:“值3-2”
}
名字。推({
名称:“c4”,
标签:{
键1:‘皮尤’,
键2:“pew pew”,
键4:‘值3-2’,
键3:“值3-1”
}
})
//if_包含filterData的键/值的筛选器
console.log(
名称.过滤器(({
标签
})=>Object.entries(filterData).every([k,v])=>tags[k]==v))
)
//仅筛选与filterData完全相同的键/值顺序不敏感
常量计数=Object.keys(filterData).length
console.log(
名称.过滤器(
({
标签
}) =>
(标签=>
tags.length==count&&tags.every([k,v])=>filterData[k]==v))
(对象.条目(标签))
)

)
我不确定您的筛选数据的格式,因此我假设这也会起作用:

var filterdata = {
   key3: 'value3-1',
   key4: 'value3-2',
};
这样,您就可以对您的姓名数据集执行
.filter()

const keys = Object.keys(filterData);
const res = names.filter((name) => {
   let flag = true;

   keys.forEach((key) => {
      if (filterData[key] !== name.tags[key]) flag = false;
   });

   return flag;
});

// res === afterFilter
如果您保持密钥名称不变,则可以省略一些内容


希望这能有所帮助。

你可以在这些方面做点什么

var names = [
  {
    name: 'c1',
    tags: {
      key1: 'value1-1',
      key2: 'value1-2',
    },
  },
  {
    name: 'c2',
    tags: {
      key1: 'value2-1',
      key2: 'value1-2',
    },
  },
  {
    name: 'c3',
    tags: {
      key3: 'value3-1',
      key4: 'value3-2',
    },
  }
]

var path = "tags.key1";
var value = "value1-1"
var filtered = []
names.forEach(elem => {
  var arr = path.split('.')
  // make a copy so that you do not operate on original entry
  var item = JSON.parse(JSON.stringify(elem));
  while(arr.length) {

    item = item && item[arr[0]]
    arr.shift();
  }
  if (item === value) {
    filtered.push(elem)
  }
})

// Filtered is result
console.log(filtered)

Codepen:

可能我收到了这个过滤器数据:var filterData={key3:'value3-1',key2:'value1-2'};