Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.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_Arrays_Object - Fatal编程技术网

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

Javascript 从数组对象中获取唯一值(复杂),javascript,arrays,object,Javascript,Arrays,Object,所以这个脚本的输出应该是: 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'] } } 这是逻辑,我希望能够得到使用min的文件。 以“1.json”为例,如下所示: myO

所以这个脚本的输出应该是:

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']
  }
}
这是逻辑,我希望能够得到使用min的文件。 以“1.json”为例,如下所示:

myObject.word1.a

而且

myObejct.word2.x

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

到目前为止的输出:[1.json]

棘手的部分来了

现在让我们转到“2.json”。 由于'1.json'已经在使用'myObject.word1.a',因此无法使用它,所以跳过它即可

到目前为止的输出:[1.json]

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

所以它不能被使用

到目前为止的输出:[1.json]

让我们转到4.json 它出现在myobject.word1.b上
它出现在myobject.word2.y让我们把
单词和
字母的组合命名为“dir”,数组元素命名为“files”

在迭代每个目录时,您可以将它们保存在(dirs)中。 在每个目录中,您可以循环其文件并更新(fileDirsMap)以保存此文件的目录

在此步骤之后,您将拥有可用的目录集,以及每个文件及其目录的映射:

['1.json', '4.json', '5.json']
现在,您可以迭代
fileDirsMap
条目
(适用于此处)。在每次迭代中,检查此文件是否有其所有的dir“not take”,如果有,则将文件添加到结果数组(
acc
),并从集合中删除其所有dir(
dirs
)(将其设置为take)

const myObject={
字1:{
答:['1.json','2.json'],
b:['3.json','4.json','5.json']
},
字2:{
x:['1.json','3.json'],
y:['2.json','4.json'],
z:['5.json']
}
};
const fileDirsMap=新映射();
const dirs=新集合();
Object.entries(myObject.forEach)([单词,字母])=>{
Object.entries(letters).forEach([letter,files])=>{
const dir=`${word}.${letter}`;
直接添加(直接);
files.forEach(文件=>
fileDirsMap.set(文件[…(fileDirsMap.get(文件)| |[]),dir])
);
});
});
const res=[…fileDirsMap.entries()].reduce((acc,[file,fileDirs])=>{
const allDirsNotTaken=fileDirs.every(fileDir=>dirs.has(fileDir));
如果(所有直接连接){
acc.push(文件);
forEach(fileDir=>dirs.delete(fileDir));
}
返回acc;
}, []);

控制台日志(res)和您的代码?你试过了?你能分享你到目前为止试过的吗?StackOverflow不是一个免费的代码编写服务,它希望您首先尝试解决自己的问题。请更新您的问题,以显示您已经尝试过的内容,并显示您在某个问题中面临的具体问题。有关更多信息,请参阅。作为开始的提示,听起来您需要两个变量(映射或设置)来跟踪哪些键和值已被查看/分配,以及一个用于输出。在遍历可能性时检查这些选项,并将插槽标记为已使用。我不理解为什么
5。鉴于
word1.b
4使用
word1.b
可以使用json。json
是的,这些约束令人困惑,因为您从单步执行单词中的键变为单步执行单词之间的json这使得我们很难说出这个练习的实际规则是什么。
dirs: [ "word1.a", "word1.b", "word2.x", "word2.y", "word2.z" ]
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" ] ]
]