首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数组对象(复杂)中获取唯一值

从数组对象(复杂)中获取唯一值
EN

Stack Overflow用户
提问于 2021-03-18 22:22:33
回答 1查看 47关注 0票数 1
代码语言:javascript
复制
var myObject = {
  word1: {
    a: ['1.json', '2.json']
    b: ['3.json', '4.json', '5.json']
  },
  word2: {
    x: ['1.json', '3.json'],
    y: ['2.json', '4.json'],
    z: ['5.json']
  }
}

因此,这个脚本的输出应该是:

代码语言:javascript
复制
['1.json', '4.json', '5.json']

这是逻辑,我希望能够获得使用min的文件。以"1.json“为例,它显示在:

myObject.word1.a

但也是如此

myObejct.word2.x

这意味着'1.json‘将不再被使用。但将被添加到输出中。

到目前为止的

输出: 1.json

这是棘手的部分。

现在让我们来看“2.json”。因为'myObject.word1.a‘已经被'1.json’使用了,所以不能使用它,所以跳过它。

到目前为止的

输出: 1.json

现在让我们转到'3.json',它出现在myobject.word1.b上,它出现在myObject.word2.x //上,但1.json已经填补了这个职位。

所以不能用

到目前为止的

输出: 1.json

让我们转到4.json,它出现在myobject.word1.b上,出现在myobject.word2.y <-这里,请记住,我们跳过了'2.json‘,因为它没有工作。所以“4.json”被接受了

到目前为止的

输出: 1.json,4.json

让我们转到5.json,它出现在myobject.word1.b上,也出现在myobject.word2.z上。

这可以使用,因为"z“键没有被任何其他文件使用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-18 23:22:09

让我们将wordletter的组合命名为"dir",将数组元素命名为"files"

在迭代每个dir时,可以将它们保存在Set (Dir)中。在每个dir中,您可以循环其文件并更新保存该文件的Map (fileDirsMap)。

在这一步之后,您将拥有一个set的dir,以及每个文件的map和它的dir:

代码语言:javascript
复制
dirs: [ "word1.a", "word1.b", "word2.x", "word2.y", "word2.z" ]
代码语言:javascript
复制
fileDirsMap: [
  [ "1.json", [ "word1.a", "word2.x" ] ],
  [ "2.json", [ "word1.a", "word2.y" ] ],
  [ "3.json", [ "word1.b", "word2.x" ] ],
  [ "4.json", [ "word1.b", "word2.y" ] ],
  [ "5.json", [ "word1.b", "word2.z" ] ]
]

现在,您可以在fileDirsMapentries上进行迭代(Array#reduce在这里是合适的)。在每次迭代中,检查这个文件是否有其所有的dirs“未取”,如果是,将文件添加到结果数组(acc)中,并从集合(dirs)中删除其所有and (将其设置为已取)。

代码语言:javascript
复制
const myObject = {
  word1: {
    a: ['1.json', '2.json'],
    b: ['3.json', '4.json', '5.json']
  },
  word2: {
    x: ['1.json', '3.json'],
    y: ['2.json', '4.json'],
    z: ['5.json']
  }
};

const fileDirsMap = new Map();
const dirs = new Set();
Object.entries(myObject).forEach(([word, letters]) => {
  Object.entries(letters).forEach(([letter, files]) => {
    const dir = `${word}.${letter}`;
    dirs.add(dir);
    files.forEach(file => 
      fileDirsMap.set(file, [...(fileDirsMap.get(file) || []), dir])
    );
  });
});

const res = [...fileDirsMap.entries()].reduce((acc,[file, fileDirs]) => {
  const allDirsNotTaken = fileDirs.every(fileDir => dirs.has(fileDir));
  if(allDirsNotTaken) {
    acc.push(file);
    fileDirs.forEach(fileDir => dirs.delete(fileDir));
  }
  return acc;
}, []);

console.log(res);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66699957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档