Дерево json & ldquo; menu & rdquo; с вложенными элементами: отметьте & ldquo; branch & rdquo;

-1
задан cedrik 22 March 2019 в 12:02
поделиться

1 ответ

Вы можете использовать некоторый рекурсивный подход для реализации этого.

let str = '1.2.1';


function checkItem(arr, strArr) {
  // iterate over the array
  arr.forEach((obj) => {
    // set selected property based on matching every digit in label in same order
    // if digits would be single then you can use startsWith and no need to split string
    obj.selected = obj.label.split('.').every((it, i) => it === strArr[i]);
    // if nested item is there then call recursively
    obj.items && checkItem(obj.items, strArr);
  });
  return arr;
}

checkItem(menus, str.split('.'));

var menus = [{
    label: "1",
    items: [{
        label: "1.1"
      },
      {
        label: "1.2",
        items: [{
            label: "1.2.1"
          },
          {
            label: "1.2.2"
          }
        ]
      },
      {
        label: "1.3"
      },
    ]
  },
  {
    label: "2"
  }
];



let str = '1.2.1';


function checkItem(arr, strArr) {
  arr.forEach((obj) => {
    obj.selected = obj.label.split('.').every((it, i) => it === strArr[i]);
    obj.items && checkItem(obj.items, strArr);
  });
  return arr;
}

checkItem(menus, str.split('.'));


console.log(menus);


UPADATE: Поскольку вы хотите обновить выбранное свойство полностью независимо от метки можно сделать что-то вроде следующего. Я предполагаю, что вы хотите обновить в зависимости от позиции в массиве.

let str = '1.2.1';


function checkItem(arr, prefixArray, strArr) {
  // iterate over the array
  arr.forEach((obj, i) => {
    // generate new prefix array for checking
    let pa = [...prefixArray, i + 1];
    // compare prefix array with the string array to check matches
    obj.selected = pa.every((it, i) => it == strArr[i]);
    // if items defined do it recursively
    obj.items && checkItem(obj.items, pa, strArr);
  });
  return arr;
}

checkItem(menus,[], str.split('.'));

var menus = [{
    label: "1",
    items: [{
        label: "1.1"
      },
      {
        label: "1.2",
        items: [{
            label: "1.2.1"
          },
          {
            label: "1.2.2"
          }
        ]
      },
      {
        label: "1.3"
      },
    ]
  },
  {
    label: "2"
  }
];



let str = '1.2.1';


function checkItem(arr, prefixArray, strArr) {
  arr.forEach((obj, i) => {
    let pa = [...prefixArray, i + 1];
    obj.selected = pa.every((it, i) => it == strArr[i]);
    obj.items && checkItem(obj.items, pa, strArr);
  });
  return arr;
}

checkItem(menus,[], str.split('.'));


console.log(menus);

0
ответ дан Pranav C Balan 22 March 2019 в 12:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: