Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Ecmascript 6 - Fatal编程技术网

在JavaScript中连接来自同一数组的数组

在JavaScript中连接来自同一数组的数组,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我有这样一个数组: [ { "id": 10002, "flag": false, "list": [ "aaa", "bbb" ] }, { "id": 10001, "flag": true, "list": [ "10002", "10003" ] }, { "id": 10003, "flag": false, "list": [

我有这样一个数组:

[
  {
    "id": 10002,
    "flag": false,
    "list": [
      "aaa",
      "bbb"
    ]
  },
  {
    "id": 10001,
    "flag": true,
    "list": [
      "10002",
      "10003"
    ]
  },
  {
    "id": 10003,
    "flag": false,
    "list": [
      "ccc",
      "ddd"
    ]
  }
]
我试过这个 最初我有“10001”值,所以迭代这个数组,如果flag==true,则取“list”数组,然后存储到newarray中。但它不起作用


我希望它是这样的:
[“aaa”、“bbb”、“ccc”、“ddd”]

您可以映射第一个项目的列表,并从这些ID获取所有列表

const mapItems = (input) => {
  const source = input[0].list;
  source.reduce((results, id) => {
    return results.concat(input.find(item => item.id === id).list);
  }, []);
};

mapItems([
  {
    "id": 10001,
    "list": [
      "10002",
      "10003"
    ]
  },
  {
    "id": 10002,
    "list": [
      "aaa",
      "bbb"
    ]
  },
  {
    "id": 10003,
    "list": [
      "ccc",
      "ddd"
    ]
  }
]);
const数组=[
{
id:10001,
旗帜:是的,
清单:[“10002”、“10003”]
},
{
国旗:错,
id:10002,
名单:[“aaa”、“bbb”]
},
{
国旗:错,
id:10003,
清单:[“ccc”、“ddd”]
}
];
常量isHead=item=>item.flag&&item.id==10001;
const head=array.find(isHead);
常量rest=array.filter(item=>!isHead(item));
const result=rest
.flatMap(项目=>
head.list.includes(item.id.toString())&&item.list
);

控制台日志(结果)
您可以获取数组中第一个对象列表的值,如
arr[0]['list']
获得这些值(100001003)后,就可以获取数组中id键与上述值之一匹配的其余对象的列表值

if(arr[i]['id'] == 10002 || arr[i]['id'] == 10003){
//fetch the list values
}

如果我理解正确,这就是您想要的:

const someArray = [
  {
    "id": 10001,
    "list": [
      "10002",
      "10003"
    ]
  },
  {
    "id": 10002,
    "list": [
      "aaa",
      "bbb"
    ]
  },
  {
    "id": 10003,
    "list": [
      "ccc",
      "ddd"
    ]
  }
];

const [head,...rest] = someArray;
const result = head.list.reduce((acc,currentId)=>acc.concat(rest.find(({id})=> id === parseInt(currentId)).list),[]);
这是一个jsFiddle

说明: 取头部并从其余部分分离,因为头部包含ID。 使用head作为字典查找head中每个id的每个列表并连接

注意,id必须在后续列表中,否则将因未定义而失败。如果要解释此错误,可以使用列表设置一个default空对象。例如,本部分:

rest.find(({id})=> id === parseInt(currentId)).list
看起来像

rest.find(({id})=> id === parseInt(currentId)) || {list:[]}).list
这基本上意味着如果它的未定义返回一个具有空列表的对象,那么它将连接一个空列表,从而得到相同的列表。(就像在乘法中乘以1)

希望能有帮助

编辑后再编辑

如果数组的顺序不同,则需要查找命令,然后逻辑是相同的

  const [newHead] = otherArray.filter(({list}) => list.every(elem=>!isNaN(elem)));

    const result2 = newHead.list.reduce(
    (acc,currentId) =>acc.concat(otherArray.find(({id})=> id === parseInt(currentId)).list),[]);
如果您正在测试标志,那么您的头部过滤器将如下所示。块是相同的,唯一改变的是条件

const [newHead] = otherArray.filter(({flag}) => flag));
(注意*我没有使用rest,而是使用了完整的数组(otherArray)。
我正在使用过滤器并提取结果的第一个元素。因为我考虑到了将来可能会有多个“字典元素”。如果将来是这种情况,那么您只需从筛选结果中提取列表

使用array.splicate。您尝试了什么来实现所需的输出?我不明白。您想要为相同的id提取列表?是的,它正在工作。。但有时像这样的数据
[{“id”:10002,“flag”:false,“list”:[“aaa”,“bbb”]},{“id”:10001,“标志”:true,“列表”:[“10002”,“10003”]},{“id”:10003,“标志”:false,“列表”:[“ccc”,“ddd”]}]
如果我理解正确,第一个项目必须标记,其他项目不应该标记?我们不能将第一个作为头..可能会更改位置。因此,哪个对象的id==10001,flag==true仅作为头数组我们不能将第一个作为头..可能会更改位置。那么,哪个对象的id==10001,flag==true仅作为头数组